有哪些提高Actionscript执行效率的技巧?

这是我在知乎上的一个回答:http://www.zhihu.com/question/20653345/answer/15754680

  1. AS3代码层面,我写过和转载过几篇文章,很浅显,希望对你有帮助:
  2. 从开发习惯上入手,例如缓存Array.length的值、把除法尽量用乘法代替等等这种小技巧。就像@吴茜 说的,网上真的很多;
  3. 了解FlashPlayer的 执行模型 和显示列表机制。了解游戏中实现动画的几种不同的方法(例如位图引擎和显示列表的区别,如果加上Stage3D又怎样?),尽量少用现成的框架,能自己写就自己写,千万不要用Flex;专用的东西永远比通用的东西要更高效;
  4. 善用FlashBuilder提供的概要分析工具;善用Adobe提供的Adobe Scout等性能分析工具;利用Flash C++ Compiler编写更高效的代码;
  5. 从虚拟机层面进行优化,@吴茜 推荐的资料 Avm2虚拟机浅析与as3性能优化 很不错,建议详读。

Socket服务器性能测试器+源码

2011-08-05升级:加入自定义数据发送的功能,规则:s字符串,b字节,i长整数,u无符号整形,n短整形。例如 :n1000,b1,i65555,s你懂的

为了测试新服务器的连接承载能力,我花了点时间写了这个测试器,但其实这只能算个雏形而已。

后来测试器使用C#重写,所以这个测试器就没再修改和更新,里面已有的BUG也没怎么解决。

目前的版本实现了以下功能:

  • 指定连接数量;
  • 允许指定连接间隔时间;
  • 发送指定大小的测试数据包;
  • 自动写入log文件(不要妄想用TextArea显示Log,最后程序会直接被log信息的更新拖死……)
  • 加入自定义数据发送的功能,规则:s字符串,b字节,i长整数,u无符号整形,n短整形。例如:n1000,b1,i65555,s你懂的

继续阅读Socket服务器性能测试器+源码

比较Object/Dictionary/Array顺序读写性能

2011-07-01更新:关于字符串创建时间的计算,以及一些新发现。


一个既需要顺序读取又需要随机读取的表,采用什么进行存储比较合适呢?

我们知道,Object和Dictionary适合随机存取,而Array和Vector适合顺序存取(关于Array和Vector的性能可以看这篇文章: Array/Vector/AS3DS/ds/dsforas性能比较 ),但它们之间的性能差距有大呢?

分析如下:

  1. Object的写性能低于Dictionary;
  2. Object与Dictionary的读写性能基本相当;
  3. Object在使用数字键名的时候,读写速度接近Array;
  4. AS会优化使用过的Object的字符串键名,因此对于整个程序的运行时间来说,创建字符串的时间不是问题;但对于性能测试来说,是很大的问题;
  5. AS也会优化创建变量的过程(或许是在编辑器层次优化?),所以对于字符串和数字等类型,把var放在循环外部,是一种良好的习惯,但对性能或许影响不大(相比而言,new的影响更大);
  6. 对于Object和Dictionary的读取,使用for each循环性能最高,已经接近Array了;
  7. 对于Array的读取,for循环性能最高。

为什么for each循环在Object与Array上的表现正好相反呢?这正体现了这两种数据结构的特性,for在顺序存取上性能高,for each在随机存取上性能高。因此,对于Object和Dictionary的读取,应尽量使用for each,而对Array和Vector则尽量使用for。

for each和for in循环在Object与Array上的性能,取决于Object是采用字符串键名还是采用数字键名。如果Object采用的是字符串键名,则for each和for in在Object上的表现就与Array一致。否则,她们的表现就与Array正好相反。

测试结果:

Object write:7582
Object for read:2309
Object for in read:234
Object for each read:103
Dictionary write:2557
Dictionary for read:2302
Dictionary for in read:242
Dictionary for each read:94
Array write:90
Array for read:64
Array for in read:81
Array for each read:79

继续阅读比较Object/Dictionary/Array顺序读写性能

Array/Vector/AS3DS/ds/dsforas 性能比较


AS3DS是我们常用的数据结构,后来polygonal又开发了ds,国人也开发了一套dsforas。那么,这些常用的数据结构与AS3原生的Array和Vector,性能上有何区别?我在网上只找到了这篇,该文也没有给出一个直观的演示,因此决定自己来测试一下。

测试平台:

  • AS3DS: v1.04
  • ds: v1.23
  • dsforas: r25
  • Flash Player: v10.2.152.26
类型 写入(ms) 读取(ms)
Array 452 132
Vector 256 130
SLinkedList 2708 1718
SSL 1266 222
LinkedList 1498 1392

注意:

  • 这次测试只是针对单链表测试了1000000个随机数的顺序写入和读取速度,不能代表整体性能。(链表的性能特点看这里:数据结构的优缺点
  • 使用AS3DS,文件增大4K;使用ds,文件增大16K。
  • AS3DS和ds不能在一个项目中测试,因为很多类名重复,必须分开测试。

继续阅读Array/Vector/AS3DS/ds/dsforas 性能比较

【转】Flash高性能开发基础系列—内存篇

转自:青竹的日志


内存优化在项目是一个重要的环节,如果不合理的利用和回收内存会合你的程序整体大大下降.

合理使用对象

创建不同对象一般所消耗的内存是不一样的。如:Number 消耗 8 个字节,int消耗4个字节, uint消耗 4个字节.下面我举一些例子:

1. int 类可使用表示为 32 位带符号整数的数据类型。 int类表示的值的范围是:-2,147,483,648 (-2\^31)2,147,483,647 (2\^31-1),所以如果你的取值范围在 -2,147,483,648 (-2\^31)2,147,483,647 (2\^31-1) 请你用int而不是用Number(刚从2.0转过来的人可能喜欢用Number)
uint 范围是0 到 4,294,967,295 (2\^32-1) 之间, Actionscript3 中类型很少,所以这些只要你平时稍加注意一下就行.

2. 合理使用Shape与Sprite,MovieClip,你可能用MovieClip可以完成Sprite与Shape的功能,但是他们所需的内存是不一样的Shape需要 236 字节,Sprite 需要 412字节, MovieClip 需要440字节,如果你只想显示图形没有交互那你使用Shape,如果是有交互的图形你可以用Sprite,如果是动画你才用MovieClip.

以上只是2个常见的实例,其实在as3中还有很多值得注意的这类情况。我还看到有些大哥为了派发一个事件而去继承Sprite类,Sprite需要消耗400字节, EventDispatcher只需要40字节。

继续阅读【转】Flash高性能开发基础系列—内存篇