避免在ActionScript中使用整型
07月 12th, 2006 — Dreamer英文原文:《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










