原文地址:http://kuwamoto.org/2006/06/15/avoid-ints-in-actionscript/
原文作者:kuwamoto
译文作者:Dreamer
当我使用Flex越多,我学到的就越多,并且当我学到关于整型(ints,为了保持与原文一致,我下面都使用ints这个名称)的东西越多,我越不想去使用它们。我决定停止使用ints,除非我真的需要它。
原因一:Numbers 可能真的比 ints 要快
很令人惊讶,但这是真的。ECMAScript第4版被设计成尽可能与早期ECMAScript版本兼容的语言。所以当它出现的时候,这使得在看起来无伤大雅的情况下确定数学运算是否“正确地”工作变得很困难。
你认为哪个版本会赢?在我的机器上,int版本用了331ms,但是Number版本用了291ms。为什么会这样?让我们来看一下下面的表达式:
当你以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的概念,为什么你可以这样做而不会导致溢出或者精度缺失:
实际上,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。
10000000;>
出处:Dreamer’s Blog
转载时必须以链接形式注明出处及本声明!
牛C网推荐您再看看以下日志:
解决flex无法调试的问题
介绍Flash中按钮控制小球左右滚动的两种写法
Flash教程-纯AS代码制作的燃烧的火焰效果
条码的检测技术
Speaking at FlexCamp in Boston on Friday
PaperVision3D里的Pixel3D例子
Flash CS3 List组件应用扩展
Flex鼠标样式(一)
.net和Flash交互的在线视频系统
Offline Synchronization using AIR and LiveCycle Data Services
解决flex无法调试的问题
介绍Flash中按钮控制小球左右滚动的两种写法
Flash教程-纯AS代码制作的燃烧的火焰效果
条码的检测技术
Speaking at FlexCamp in Boston on Friday
PaperVision3D里的Pixel3D例子
Flash CS3 List组件应用扩展
Flex鼠标样式(一)
.net和Flash交互的在线视频系统
Offline Synchronization using AIR and LiveCycle Data Services
Flash Media Server 3 (FMS3)下载地址
ActionScript处理异步事件(一)





