Flash高性能开发基础系列―数据容器

这节内容其实是AS版数据结构与算法,AS中性能瓶颈在主要渲染,所以大部分开发人把优化精力放在渲染从而忽略在数据层的优化。不同的数据组织(数据结构)直接影响你的数据操作效率,在大多量语言中都提供丰富的对象容器,比如java中的Set,Map,Array,Queue等等,其中封装了大量的针对于某种数据结构的操作方法,从而大大提高了数据操作效率和开发效率,as3内置的线性结构Array一种,大家也别无选择。在数据量不是很大的时候数组和其它数据结构的差异体现的不是很明显,但是如果你对大量数据进行删除和插入,这时候你的可能需要考虑其它的数据结构,比如:链表。

我们来了解一个不同的数据结构有什么不同的特性,如果你大学学的数据结构没有遗忘的话你可以不用看这一段文字。任何一种存储结构都有他的优点和缺点.下面我们来具体的特性:

 



 

 

AS3没有内置这些数据结构,但是我们可以选择第三方库,最著名的就是国外一个人写的polygonal,但是polygonal存在一些严重问题,我的有一篇日志详细说明(http://uh.9ria.com/space-109929-do-blog-id-7310.html),我们采用另一款数据结构库ASDS做demo(这里下载http://code.google.com/p/dsforas/)。

    我来举一个简单的游戏实例来说明游戏中数据组织的重要性,假如我们在斗地主游戏中服务器给我们发牌或出牌我们必须保证手中的牌都是有须的,如3,4,5,6,........;我们一般的做法只就是将所有的牌存在一个数据中,然后将向数组中进行插入数据。

 

 public function insert(index:uint,o:*):Void{

            var size:int=_array.length;

          if(index>sizereturn;

          for(var i:int=size;i>index;i--){

              _array[i]=_array[i-1];

          }

         _array[index]=o;

}

在数组中每做一次插入是将插入位置以后的数据向后移动腾出空间后再写入指定数据,在移动数据的过程中消耗了大量时间。


 

假如我们采用链表的存储方式,由于链表(如果不知道什么是链表可以去百度是查一下,我这里不重复)的结构特性所以插入效率非常高,具体的我看图吧.



 

 

 

以上只是理论,我们来做一个效率测试吧.

package {

       import asds.list.LinkedList;

       import flash.display.Sprite;

       public class Demo extends Sprite{

            private var _array:Array=[]

            private var _linked:LinkedList=new LinkedList(10000);

            public function Demo(){

                for(var i:int=0;i<10000;i++){

                    linked();

                    array()

                }

            }

            private function linked():void{

                _linked.addAtFirst(0);

            }

           private function array():void{

               insert(0,0);

           }

           public function insert(index:uint,o:*):void{

               var size:int=_array.length;

              if(index>size) return;

              for(var i:int=size;i>index;i--){

                  _array[i]=_array[i-1];

              }

            _array[index]=o;

        }

   }

}

以上是一个插入测试,分别对数组和对链表进行1w次插入00位置,profile中看到调用array()linked()消耗总时分别为24980毫秒和102毫秒,做这种操作linked24(大家可以自行测试,不同的电脑硬/软件环境测试的结果可能不一样)

以上对数据结构说的非常浅,如果大家要深入的学习数据结构,请买一本书好好研究一翻,这篇文章的目的是呼吁大家重视数据结构基础的学习。在我对我面试的一些人和身边的同事进行的了解得知大部分人对这些基础知识学习和使用经验非常少.并不是在某些方面做的非常突出,而在某些方面又做的不好,从而造成性能瓶颈,要写出高性能代码,就得在各个方面都做好。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值