分类: 系统运维
2008-03-12 20:52:47
今天又有一位朋友和我在MSN上聊起了AS3中存取数据效率的话题,突然想起以前。这个话题还有蛮多人感兴趣,比较实用,让它在论坛上沉下去有些可惜。因此特地整理成帖,希望对大家有用。废话少说,看蕉:
使用如下几种存取数据方式进行存取100万次运算,所花时间依次为(单位为毫秒,ms):
如下几种存取数据方式100万次存取运算效率依次为:
* 类定义中的属性(如public、private类属性) 135 毫秒
Point类对象 140 毫秒
Rectangle类对象(x等属性) 140ms
* Array类对象 270ms
* Object类对象 500 ms
动态类动态属性 550
* Rectangle类对象(left等属性) 700
* 自定义类getter/setter 1000
自定义类Function 1000
(以上测试结果是由测试的,感谢eidiot。稍微做了一点文字修改。见)
测试用的自定义类是密封类,那么,public等类定义中定义好的属性比Array和Object快是正常的。因为查询密封类的类成员(包括属性和方法)
只需要查询TraitObj,加一个 prototype obj。而Array, Object都是动态类,不论是内存分配和name
lookup都需要额外的开销。
同理,Point、Rectangle也是密封类,当然比Array和Object要快。
这是AS3新的内部实现机制的优点。如果在AS2.0中,则不会有差别。注,AS2的密封类和动态类的支持只存在于编译阶段,在运行时没有区别,无法区分。
有兴趣的朋友可以试试将AS3自定义类设成动态类,再使用动态属性和非动态属性存取10万次比较看看。
只要是我们在类定义中定义的成员(包括属性和方法),都在这个类对应的Trait obj中。动态类和密封类都一样。因此,密封类和动态类的属性,方法效率都会相同。具体的实现是通过Slot方式来实现,通过slot index来访问,效率高。
可以肯定的是,核心类中的实现都是native code。但是,Rectangle类的功能并不复杂,而且处于flash.geom包,非核心类。我在想,难道连这个类的方法也是native实现吗?
如果测试多次也是这样,并且测试方法无偏差,那么基本上可以肯定Rectangle类中也是使用了native code。
那么做一个推论,是否只要是Flash API的类基本上都是由native code实现呢?
建
议使用其他包中的类,也测试一下他们的getter和setter。如果Flash
API中类的getter和setter速度一致,且比自定义类的快,那么大概可以下结论,所有Flash Player
API(包括核心类和非核心类)真的都是用native code实现的。