`
ongsh321
  • 浏览: 101072 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

(转)AS3中的数据存取方式效率比较

阅读更多
AS3教程(13):AS3中的数据存取方式效率比较
2008年12月01日 星期一 16:33

今天又有一位朋友和我在MSN上聊起了AS3中存取数据效率的话题,突然想起以前曾在blueidea论坛上讨论过。这个话题还有蛮多人感兴趣,比较实用,让它在论坛上沉下去有些可惜。因此特地整理成帖,希望对大家有用。废话少说,看蕉:
使用如下几种存取数据方式进行存取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测试的,感谢eidiot。稍微做了一点文字修改。见讨论原帖

问题1:为什么会有速度差别?

  最快的是第一类,速度是Array的两倍,Object的四倍,getter/setter的约八倍。存取坐标要用Point和Rectangle,比Array快的多。 Object和动态类效率较低,一般情况下请尽量使用密封类。 

测试用的自定义类是密封类,那么,public等类定义中定义好的属性比Array和Object快是正常的。因为查询密封类的类成员(包括属性和方法)只需要查询TraitObj,加一个 prototype obj。而Array, Object都是动态类,不论是内存分配和name lookup都需要额外的开销。
同理,Point、Rectangle也是密封类,当然比Array和Object要快。
这是AS3新的内部实现机制的优点。如果在AS2.0中,则不会有差别。注,AS2的密封类和动态类的支持只存在于编译阶段,在运行时没有区别,无法区分。
有兴趣的朋友可以试试将AS3自定义类设成动态类,再使用动态属性和非动态属性存取10万次比较看看。

问题2:为什么有些类的属性效率会存在差异?比如Rectangle的x属性和left属性为何差别这么大?

Rectangle类除了x,y,width,height,其余属性全部是getter和setter,不是真正的属性。使用getter和setter时,函数调用需要一些开销,自然比真正的属性要慢一些。

问题3:为何动态类和密封类的类定义中的成员效率没有差别?

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

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

问题4:动态成员的效率和非动态成员的效率为何有差距?AS2中为何没有这样的区别?

因为动态类的动态属性不存在与trait obj中,而是在prototype obj中一个类似于哈希表的数据结构中。哈希表代价是name lookup效率明显低于slot方式,而且生成时系统的开销较大。因此AS3中,动态类的动态成员效率低于类定义中定义的成员。在AS2中,动态属性和非动态属性的区别只存在于编译阶段,运行时并没有区别。因为运行时,实质上所有对象成员都是以name为索引,name都存储在一张hash table(哈希表)中。所以AS2中没有AS3效率高,也没有这些区别。

问题5:private成员和public成员效率有没有差别?

访问private成员和访问public成员不会更快。实际上public, private, protected, internal等只是AS3中内嵌的四个命名空间而已,并不会对访问速度产生差异。他们在Trait obj中都是同样使用slot来存储的,访问也都是通过slot index。理论上说,我们使用自定义的命名空间来修饰类成员,那么这个类成员的访问速度也应该和内嵌的命名空间一样。有兄弟感兴趣的话,可以继续试试使用自定义命名空间来测试一下。

有趣的发现:看测试结果,似乎Rectangle实现的getter和setter速度,要比一般的getter和sette和自定义function要快300。这个真是很有趣。

解释:AS3中不少核心类的方法都是native(关键字)实现,即最终的实现是由AVM语言自然代码(native code)实现,而不是ActionScript代码实现。比如Object类,Class类等等,他们的方法都是native的,由相应的C++代码实现。因此,会比我们自定义类的效率要高不少。

黑羽可以肯定的是,核心类中的实现都是native code。但是,Rectangle类的功能并不复杂,而且处于flash.geom包,非核心类。我在想,难道连这个类的方法也是native实现吗?
如果测试多次也是这样,并且测试方法无偏差,那么基本上可以肯定Rectangle类中也是使用了native code。
那么做一个推论,是否只要是Flash API的类基本上都是由native code实现呢?
建议使用其他包中的类,也测试一下他们的getter和setter。如果Flash API中类的getter和setter速度一致,且比自定义类的快,那么大概可以下结论,所有Flash Player API(包括核心类和非核心类)真的都是用native code实现的。

分享到:
评论

相关推荐

    as3数据结构-中文注释.rar

    本资源"as3数据结构-中文注释.rar"显然是为了帮助开发者深入理解AS3中的各种数据结构,并提供了中文注释,使得学习过程更为直观。 数据结构是组织和存储数据的方式,它决定了数据的访问和操作效率。AS3中的主要数据...

    VB 流方式存取数据

    在VB(Visual Basic)编程中,流方式存取数据是一种高效且灵活的数据处理技术,它允许程序员以流的形式读写各种类型的数据,如图片、文本文件、媒体文件和可执行文件等。这种方式常用于数据库应用,可以将这些数据...

    在SQLServer2000中实现存取照片字段

    通过使用`GetChunk`和`AppendChunk`方法,我们可以在SQL Server 2000中高效地存取图像数据。这种方法不仅减少了内存占用,也提高了数据处理的效率。对于需要频繁读写图像数据的应用场景来说,这是一种非常实用的技术...

    visual basic2005文件IO与数据存取秘诀第10章范例

    在Visual Basic 2005中,文件I/O(Input/Output)和数据存取是程序开发中的核心部分,尤其对于处理大量数据时,高效的数据导入导出能力至关重要。本章重点介绍了如何利用SQLBulkCopy对象来执行大量数据的复制操作,...

    AutoCAD属性块与EXCEL表格的双向存取

    本文详细介绍了一种方法,能够实现AutoCAD属性块与Excel电子表格之间的双向数据存取,并提供了具体的示例和代码。 #### 将AutoCAD属性存入Excel电子表格 本部分介绍如何将AutoCAD图纸中的属性块数据提取并保存到...

    visual basic2005文件IO与数据存取秘诀第8章范例

    在Visual Basic 2005中,文件I/O(Input/Output)和数据存取是程序开发中的核心技能,尤其对于处理大量数据或与外部存储交互的应用程序来说至关重要。本章,我们聚焦于如何高效地利用多活动结果集(Multiple Active ...

    ACCESS存取图片

    在数据库管理领域,Microsoft Access是一个广泛使用的工具,它允许用户创建和管理各种数据,包括文本、数字以及图像。...正确地在Access中处理图片,不仅可以提高数据管理效率,还能提供更丰富的用户体验。

    as3 MVC俄罗斯方块 可双人联机游戏 服务断使用nodejs

    7. **数据库存储**:可能需要一个数据库来保存游戏记录、用户信息、房间状态等数据,如Redis或MongoDB等NoSQL数据库可能是理想选择,因为它们能提供高效的数据存取。 8. **游戏服务器架构**:Node.js的非阻塞I/O和...

    protobuf-actionscript3-2.3.zip

    6. **使用流程**:使用protobuf的步骤包括定义.proto文件、编译.proto文件生成AS3代码、在AS3项目中引入生成的库、实例化消息类、填充数据、然后进行序列化或反序列化操作。 7. **错误处理与版本控制**:protobuf...

    Word文件在Oracle中存取技术的设计与实现.pdf

    在实现Word文件在Oracle中的存取技术时,通常会有一个过程,如以下代码示例所示: ```vb Sub FileToColumn(col As ADODB.Field, WordFile As String) Const ChunkSize As Long = 4096 '每次处理4KB数据 Dim ...

    AS400 中文培训教程

    - **单级存储结构**:AS/400采用了一种称为Single Level Storage (SLS) 的内存管理机制,它可以自动管理数据和程序的存储位置,确保经常访问的数据位于高速缓存中,而较不常用的数据则存储在磁盘上。这种机制有效地...

    Easy Save 3.zip

    这些脚本提供了数据存取的接口,例如Save、Load、Delete等方法,使得开发者能够方便地在游戏逻辑中调用。 在实际应用中,Easy Save 3插件不仅支持在游戏运行时的即时保存和加载,还可以配合Unity的Editor进行预设值...

    图片上传与下载及在数据库中的存取

    3. 数据库中的图片存取: - **文件路径存储**:一种常见方法是只存储文件的路径,而不存储实际文件内容。这样数据库较小,但需要确保文件系统和数据库的一致性。 - **二进制数据存储**:另一种方法是将图片转换为...

    AS400应用系统性能优化

    在DB2 UDB AS/400中,有两种主要的存取方式:表扫描和基于索引的检索。虽然基于索引的检索通常更快,但在处理大量数据时,表扫描可能更有效。因此,设计高效索引至关重要。有效索引的编码应避免数字转换、算术表达式...

    传统烟草自动化仓储存取系统分析与改进.rar

    1. 提升效率:自动化系统通过机器人、AGV(自动引导车)、AS/RS(自动化立体仓库)等设备,实现了快速、准确的存取作业,大大提高了仓储作业效率。 2. 减少误差:自动化系统采用精确的传感器和条形码/RFID(无线频率...

    浪潮存储安装指导书AS5600

    这些步骤对于确保数据的安全性和提高数据存取效率至关重要。 四、映射主机 映射主机涉及到创建主机组、LUN组,配置端口连接方式和端口组,以及创建LUN组-端口组-主机组映射。这些操作可以将存储空间映射给特定的...

    AS SSD Benchmark.7z

    2. **4K随机读写测试**:模拟日常操作中的小文件存取,如打开应用程序、编辑文档等,测试SSD的响应速度。 3. **4K-64线程队列深度测试**:在多任务环境下,模拟大量并发I/O操作,考察SSD在高负载下的性能表现。 4. *...

    SQL在健康体检队列数据清洗、数据报表中的应用.pdf

    在处理健康体检队列数据时,SQL语言是进行数据清洗、查询、分析与报表生成的重要工具。...对于健康体检队列这类数据量大、处理逻辑复杂的应用场景,SQL及PL/SQL提供了强大的工具,以确保数据处理的准确性和效率。

    Dim ds As New DataSet_java_

    标题中的“Dim ds As New DataSet_java_”是一个VB.NET代码片段,它声明并初始化了一个名为`ds`的数据集(DataSet)对象。数据集是.NET框架中的一个类,它用于存储和处理关系型数据,通常是从数据库中检索的。在Java...

Global site tag (gtag.js) - Google Analytics