避免在ActionScript中使用整型

英文原文:《Avoid ints in ActionScript》
原文地址:http://kuwamoto.org/2006/06/15/avoid-ints-in-actionscript/
原文作者:kuwamoto

译文作者:Dreamer 。其它声明请参考本站的置顶日志。

避免在ActionScript中使用整型(ints)

当我使用Flex越多,我学到的就越多,并且当我学到关于整型(ints,为了保持与原文一致,我下面都使用ints这个名称)的东西越多,我越不想去使用它们。我决定停止使用ints,除非我真的需要它。

原因一:Numbers 可能真的比 ints 要快

很令人惊讶,但这是真的。ECMAScript第4版被设计成尽可能与早期ECMAScript版本兼容的语言。所以当它出现的时候,这使得在看起来无伤大雅的情况下确定数学运算是否“正确地”工作变得很困难。

public function timingTest() : void
{
var intTime : Number;
var numberTime : Number; var i : int;
var j : int = 0;

intTime = (new Date()).time;
for (i=0; i<10000000; i++)
j = (j + 15) / 7;

intTime = (new Date()).time - intTime;

var n : Number;
var m : Number = 0;

numberTime = (new Date()).time;
for (n=0; n<10000000; n++)
m = (m + 15) / 7;

numberTime = (new Date()).time - numberTime;

var message : String =
“int version: ” + intTime + “msn” +
“Number version: ” + numberTime + “ms”;

Alert.show(message);
}

你认为哪个版本会赢?在我的机器上,int版本用了331ms,但是Number版本用了291ms。为什么会这样?让我们来看一下下面的表达式:

j = (j + 15) / 7;

当你以j=2^31-1的值作为初始值的时候会发生什么?在一些语言中,当你在上面加15时会得到溢出错误。但是,ECMAScript对数字有个更宽松的概念。当需要的时候系统会像期待的那样平稳地将ints转换成doubles。正因如此,实质上内部所有的数字都是作为Number来执行的,而不是int。

假设无论如何所有的数字都是被当作Number来执行的,那么把int转换成Number然后再转换过来造成的额外时间开销就很可观,这也使为什么上面的int版本为什么会比较慢。

还有第二个应该使用Number而不是int的原因,那就是Number可以让你比ints更精确地存储整型的值…

原因 2:Numbers 有更多位

这是关于Numbers的一个令人惊奇的事实,这在后面看来是显而易见的。让我告诉你我是如何发现这一点的。

Date对象有一个叫做 time 的属性,它提供从1970年1月1号0点到当前时间时间差的毫秒数。因为它是一个整型的值,并且在ActionScript中没有longs类型,所以我就假设返回值得类型是一个int(或者可能是uint)。

Bug是什么?快速浏览一下back of the envelope calculation 你就会发现同1970年1月1日的时间差的毫秒数超过了2^32,它会导致溢出。愚蠢的错误。

但是这让你感到惊讶……假如你不能将那么多位存入一个int并且如果ActionScript没有long的概念,为什么你可以这样做而不会导致溢出或者精度缺失:

var time : Number = (new Date()).time;

实际上,Number等同于下面数字类型中的一个:
·int
·uint
·IEEE double

我总是回避使用doubles来做整数运算,因为你从不能担保它会保存你的全部数字。我认为,一个double与ints相比可以保存更大范围的数字(因为它的指数)并且能有更高的精确度。

正如所说的那样,在ActionScript中,一个double与任意的整型值相比可以保存更大范围的数字(因为它的指数)并且有更高的精确度。

IEEE double 格式就像这样:
S EEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
0 1 11 12 63

其中有一个符号位,11个指数位,并且这个数字的整数部分占据52个位。所以,你可以在不损失精度的情况下保存比int多很多位的数字。

究竟什么时候你希望使用int呢?

下面是关于ints的合理使用的情况:

1.当你想减少内存使用的时候。(尽管当你有非常非常非常非常多的数字保存的时候效果才看得出来)
2.当你想要强制一个整型值的时候(例如:var i: int = j / 2)
3.当你把客户端的整型值映射到客户端,想要减少bug出现的机会时候。

综上所述,从现在起在大部分代码中我将会一直使用Numbers。


本文链接:http://www.zhuoqun.net/html/y2006/149.html 转载请注明出处。TrackBack:http://www.zhuoqun.net/html/y2006/149.html/trackback

相关日志


Posted in Flex, 技术.

没有评论

(Required)
(Required, will not be published)