数据存取方式效率比较

转自http://bbs.blueidea.com/viewthread.php?tid=2752268&page=1
 通常我们存取数据有如下几种方式:Array, Object, 自定义类, 比较特殊的还有 Point, Rectangle 等。效率依次为(后面的数字是100万次存取运算平均所需时间):

    * 自定义类public属性135 | Point140 | Rectangle(x等属性)140
    * Array270
    * Object500 | 动态类动态属性550
    * Rectangle(left等属性)700
    * 自定义类getter/setter1000 | 自定义类Function1000

  出乎意料,最快的是自定类的public属性,速度是Array的两倍Object的四倍getter/setter的八倍——很整的倍数关系。另外存取坐标要用Point和Rectangle,比Array快的多。Object还是少用吧,多用自定义类。

---------------------------------------------补充
  另外自定义密封类(sealed,默认)和自定义动态类(dynamic)的public属性、getter/setter速度几乎一样,而动态类动态添加的属性和Object相若。(感谢黑羽提醒)

to 黑羽:

是我没写清楚,你说的测试都已经做了的
对于密封和动态类来说, public 属性 和 getter/setter 的速度几乎没有差别
动态类动态添加的属性和Object速度相若
在第三条的后面

* Object500 | 动态类动态属性550

至于测试方法,我是各做 100万次 o.x = o.x + 1; 这样的运算 —— 存取各一次
第二个问题没有看明白,和谁比较 “200-300这样的差距” ?
对于 getter/setter 和 public 属性的测试表达式是完全一样的
只方法的测试代码不同

o.setX(o.getX() + 1);

结果 getter/setter 和 方法设置速度一样,都是1秒

是的,Rectangle类除了x,y,width,height其余属性全部是getter和setter。看你的测试结果似乎是比一般的getter和sette和自定义functionr要快300。这个真是很有趣。

AS3中不少核心类的方法都是native(关键字)实现,即最终的实现是由AVM语言自然代码(native code)实现,而不是ActionScript代码实现。比如Object类,Class类等等,他们的方法都是native的,由相应的C++代码实现。因此,会比我们自定义类的效率要高不少。
但是,Rectangle类的功能并不复杂,而且处于flash.geom包,非核心类。我在想,难道连这个类的方法也是native实现吗?

如果你测试多次也是这样,并且测试方法无偏差,那么基本上可以肯定Rectangle类中也是使用了native code。

那么做一个推论,是否只要是Flash API的类基本上都是由native code实现呢?
建议使用其他包中的类,也测试一下他们的getter和setter。如果Flash API中类的getter和setter速度一致,且比自定义类的快,那么大概可以下结论,真的是native实现。


这个是正常的。并不费解。之前想问你有没有区分动态成员和非动态成员,就是要弄清这个问题。

只要是我们在类定义中定义的成员,即包括属性和方法,都在这个类对应的Trait obj中。动态类和密封类都一样。因此,密封类和动态类的 属性,方法效率都会相同。具体的实现是通过Slot方式来实现,通过slot index来访问,效率高。

但动态类的动态属性不存在与trait obj中,而是在prototype obj中一个类似于哈希表的数据结构中。哈希表代价是name lookup效率明显低于slot方式,而且生成时系统的开销较大。因此AS3中,动态类的动态成员效率低于类定义中定义的成员。

在AS2中,动态属性和非动态属性的区别只存在于编译阶段,运行时并没有区别。因为运行时,实质上所有对象成员都是以name为索引,name都存储在一张hash table(哈希表)中。所以AS2中没有AS3效率高,也没有这些区别。
原文地址:https://www.cnblogs.com/sevenyuan/p/1615451.html