`

AS3效率优化:使用Vector数据类型

    博客分类:
  • AS3
阅读更多

自FlashPlayer10伴随着FlashCS4发布时,AS3中就多了一种新的数据类型:Vector
这里先给不大熟悉Vector的同学们做一下简介(节选并改编自官方文档):


Vector是一种特殊的数组
  • 首先,Vector的定义和C语言中“数组”更为接近,即数组的每一个元素都有相同的数据类型。(这就意味着对Vector中元素的访问要经过类型检查)
  • 其次,Vector是一种密集数组,即每一个索引中必须包含一个值。(可以是null)
  • 最后,Vector可以随时指定为固定长度的数组。

由于这些特殊性,Vector便拥有以下几点优势:
  • 性能:使用 Vector 实例时的组元素的访问和迭代速度比使用 Array 时的要快很多。
  • 类型安全性:在严格模式下,编译器可以识别数据类型错误。(但当使用 push() 方法或 unshift() 方法向 Vector 添加值时,编译器不会检查参数的数据类型,而是在运行时检查)
  • 可靠性:相对于 Array,运行时范围检查(或定长检查)极大地提高了可靠性。


今天我们主要关注的是使用Vector数据类型来优化程序效率。
对于追求效率的RIA应用,使用Vector来提升效率是一种简单却行之有效的办法,
然而很多开发者对Vector的了解不够深入,以致未能充分发挥Vector在速度的优势。
接下来我们便来剖析一下Vector的最佳使用方法。


注:下文中所有代码的运行环境:FlashPlayer 10.1 & Mac OS X 10.6.4,所有耗时均经过多次统计平均并取整。一、Vector数组的长度应当固定
Vector类型在AVM中的实现使用的是定长数组,虽然在AS3中其fixed属性默认为false,但仍不建议对Vector数组进行能够更改长度的操作。
请看以下测试:

  1. var a:Vector.<uint>=new Vector.<uint>(1000000);
  2. var b:Vector.<uint>=new Vector.<uint>(10000000);
  3. var t:Number=getTimer();
  4. for(var k:uint=0;k<9;k+=1){
  5. a.concat(new Vector.<uint>(1000000));
  6. }
  7. for(var i:uint=0;i<10000000;i+=1){
  8. a[i]=i;
  9. i=a[i];
  10. }
  11. trace(getTimer()-t);
  12. //////////////////////////////////
  13. t=getTimer();
  14. for(var j:uint=0;j<10000000;j+=1){
  15. b[j]=j;
  16. j=b[j];
  17. }
  18. trace(getTimer()-t);
复制代码


同样是对长度为1千万的数组进行操作,前者的耗时在850ms,后者则保持在350ms。
如果将上述代码中的Vector a使用1千万次push操作来达到1千万的长度,则耗时变为1800ms。
(事实上,用上述代码对Array进行测试,有同样的耗时比率,所以无论使用哪种数组,都不建议频繁改变其长度)
至于splice操作的耗时,请参见gskinner的Quick As A Flash: Optimization Strategies for AS3 and Flash可以看到,Vector的splice操作要比Array慢出10倍。二、正向/逆向遍历的速度无差异
对于Array类型,正向/逆向遍历其元素的速度大约是3:2,即逆向遍历要慢一些,比如以下代码:

  1. var a:Array=new Array(10000000);
  2. var b:Array=new Array(10000000);
  3. var t:Number=getTimer();
  4. for(var i:uint=0;i<10000000;i+=1){
  5. a[i]=i;
  6. i=a[i];
  7. }
  8. trace(getTimer()-t);
  9. //////////////////////////////////
  10. t=getTimer();
  11. for(var j:uint=9999999;j>0;j-=1){
  12. b[j]=j;
  13. j=b[j];
  14. }
  15. trace(getTimer()-t);
复制代码


二者的耗时基本一样,经过多次平均,Array耗时要比Vector多3%~8%,速度上仍然不及Vector,如非对效率要求极高,基本可以忽略。
最后对使用String类型的情况进行了单独测试,与引用类型下的表现结果一致。
四、注意索引的数据类型
很多开发者会忽略一个细节,那就是在AS3中“看起来是整数的”不一定就是整数类型。
请看以下的代码段:

  1. var a:Vector.<uint>=new Vector.<uint>(10000000);
  2. var t:Number=getTimer();
  3. for(var i:uint=0;i<10000000;i+=1){
  4. a[i*2/2]=i;
  5. i=a[i*2/2];
  6. }
  7. trace(getTimer()-t);
  8. //////////////////////////////////
  9. t=getTimer();
  10. for(var j:uint=0;j<10000000;j+=1){
  11. a[uint(j*2/2)]=j;
  12. j=a[uint(j*2/2)];
  13. }
  14. trace(getTimer()-t);
  15. //////////////////////////////////
  16. t=getTimer();
  17. for(var k:uint=0;k<10000000;k+=1){
  18. a[(k*2/2)>>0]=k;
  19. k=a[(k*2/2)>>0];
  20. }
  21. trace(getTimer()-t);
  22. //////////////////////////////////
  23. t=getTimer();
  24. var n:uint;
  25. for(var q:uint=0;q<10000000;q+=1){
  26. n=(q*2/2);
  27. a[n]=q;
  28. q=a[n];
  29. }
  30. trace(getTimer()-t);
复制代码


四种方式的耗时分别是1100ms,750ms,650ms,550ms,当然,最后一种由于只计算了一次,不具可比性。(如果同样计算两次,则是750ms)
这里测试用的是乘法和除法,另经测试,+1/-1的结果也是一样。
所以这里特地提一下,如果一定要把算式直接写在索引的位置,要使用位运算将其转化为整数。
关于AS3效率优化中Vector的使用,目前我能想到的就是这四点。(不排除以后想起来了再更新)
希望能对各位有所帮助。

分享到:
评论

相关推荐

    flash as3.0代码优化

    - 使用 `Vector` 类代替传统的数组 (`Array`),特别是在处理大量同类型数据时,`Vector` 提供了更好的性能。 - 示例:`var coords:Vector.&lt;Number&gt; = Vector.([132, 20, 46, 254, 244, 100, 20, 98, 218, 254]);` #...

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

    掌握这些数据结构对于开发AS3应用至关重要,无论是游戏、动画还是交互式内容,都需要根据实际需求选择合适的数据结构以优化性能和代码结构。通过阅读提供的中文注释,学习者可以更好地理解和应用这些概念。

    Adobe Flex编码指南v1.2(AS3 Flex3程序代码编写规范)

    - 强类型系统:在AS3中,变量必须预先声明其数据类型,这有助于提高代码的稳定性和可维护性。 - 类与对象:AS3支持类继承、封装和多态性,允许开发者创建复杂的面向对象结构。 2. Flex3框架: - Flex是基于MXML...

    AS3 编写的非常简单的汉诺塔

    7. **数组与数据结构**:为了存储盘子信息,可以使用数组或Vector数据结构。数组可以表示各柱子上的盘子顺序,而Vector提供类型安全和性能优化。 8. **图形用户界面(GUI)**:在Flash Builder中,可以通过MXML来...

    as3教程_flash_ActionScrip_3

    它不仅提供了更为丰富的数据类型和类库支持,还极大地提升了执行效率。AS3 的语法与 Java 和 C# 类似,对于熟悉这些语言的开发者来说更加友好。 #### 三、AS3 在 Flash 9 中的新特性 ##### 3.1 事件处理模型的变化...

    AS3 Data Structures For Game Developers.zip

    Vector是AS3中的优化版数组,它提供类型安全和更好的性能。与数组相比,Vector在编译时就确定了元素类型,从而避免了运行时类型检查的开销。在处理大量游戏对象或需要高性能操作时,Vector是理想选择。 3. **链表...

    AS游戏设计常用数据结构

    本文将深入探讨AS(ActionScript)游戏设计中常用的数据结构,并结合标签中的"源码"和"工具",介绍如何利用这些数据结构优化游戏开发。 首先,数组是最基础的数据结构,用于存储一组有序的元素。在AS中,我们可以...

    Flash优化技巧整理

    **9、AS版数据结构与算法:第三方支持** - **第三方库**: 利用第三方提供的数据结构和算法库可以极大地提升程序的性能。 **10、优化细节代码** - **细节优化**: 关注代码的每一个细节,即使是看似微不足道的地方...

    postgis文档

    - **ASP.NET C#样例:使用ST_AsPNG及其他栅格函数输出数据**:C#语言的应用实例。 - **Java控制台应用:输出栅格查询为图像文件**:Java语言的应用实例。 - **通过SQL使用PLPython dump图像数据**:使用PLPython...

    cpp-MessagePackCC的高效二进制序列化库例如JSON

    3. **灵活性**: 支持多种数据类型,包括整数、浮点数、布尔值、字符串、数组、映射(字典),以及自定义对象。 4. **兼容性**: MessagePack 是跨语言的,可以在不同的编程语言之间共享数据。 ### 2. `msgpack-c` 库...

    DescriptionPaneAS3_flash源码_

    6. **动作脚本优化**:通过源码分析,掌握AS3代码优化技巧,提高程序运行效率。 7. **类库使用**:了解Flash Player内置的类库,如Vector、Math、TimelineControl等,以及如何高效利用它们。 8. **错误处理与调试*...

    各学习网站积累

    5. **数据类型和数据结构**:AS3有动态和静态类型的区分,了解如何使用Array、Dictionary、Vector等数据结构可以优化代码性能。 6. **错误处理**:学习如何使用try-catch语句进行错误处理,以确保程序的健壮性。 7...

    ActionScript 3 Cookbook code

    5. **数据结构和算法**:ch04.txt可能包含关于数组操作、排序算法或其他数据结构(如Vector)的示例,这些都是优化代码效率的关键。 6. **网络通信**:AS3可以进行HTTP请求,XML或JSON数据的解析,ch12.txt可能涉及...

    大整数的四则运算+四则 分开

    在处理超过标准整型变量范围的大整数时,我们不能简单地依赖于内置的数据类型,而是需要使用特殊的算法和数据结构。这个压缩包中的文件分别对应了大整数的加法、减法、乘法和除法的实现,让我们逐一探讨这些知识点。...

    ActionScript3.0编程

    - **类型安全**:AS3强制类型检查,要求所有变量都有明确的数据类型,减少了运行时错误。 - **异常处理**:引入了try-catch-finally语句,可以优雅地处理运行时错误。 - **数组和集合**:提供了更高效的数组操作和...

    创建60FPS高效运行的游戏

    - **字符串处理**:使用字符串方法替代正则表达式,因为后者在某些情况下可能效率较低。 - **小心使用E4X和XML()**:这些功能虽然方便,但在性能上可能不如直接操作字符串。 - **回调函数优于事件监听**:在关键代码...

    ActionScript3.0 中文版

    4. 数据类型:AS3.0支持基本数据类型(如int、uint、Number、Boolean、String等),以及复杂类型如Array、Object和XML。强类型系统确保了代码的稳定性和可预测性。 5. 异常处理:通过try、catch和finally语句,...

Global site tag (gtag.js) - Google Analytics