|
讨论说明:Flash Ation Script的效率不佳,相信写AS的朋友最关心也最头痛的莫过于此了。所以如何提高AS 的效能值得探讨的。 希望大家能把平时积累的一些经验在此分享一下。
讨论一:在国外看到一个有意思的讨论,总结了一下,看以下4段代码,请分别执行,看看所用的时间。
var MAX_VALUE = 39999
function loop() {
var st=getTimer()
var z;
for ( i=0; i<MAX_VALUE; i++) {
z ++;
}
trace(getTimer()-st);
}
_global.MAX_VALUE = 39999
function loop() {
var st=getTimer()
var z;
for ( i=0; i<MAX_VALUE; i++) {
z ++;
}
trace(getTimer()-st);
}
function loop() {
var MAX_VALUE = 39999
var st=getTimer()
var z;
for ( i=0; i<MAX_VALUE; i++) {
z ++;
}
trace(getTimer()-st);
}
function loop() {
var MAX_VALUE = 39999
var st=getTimer()
var z;
for (var i=0; i<MAX_VALUE; i++) {
z ++;
}
trace(getTimer()-st);
}
回帖一:有意思。以后循环都要加上var了。
回帖二:想不到一个VAR竟然快了这么多。
回帖三:所以,上面的结论是多使用局部变量!
原贴地址:http://www.blueidea.com/bbs/NewsDetail.asp?id=1057820 仍在讨论中,敬请关注.
讨论二:看来要尽量使用局部变量。 另外改造一下for循环也能显著提高效率
function loop() { var MAX_VALUE = 39999 var st=getTimer() var z; for (var i=MAX_VALUE;--i>0;) { z ++; } trace(getTimer()-st); }
回帖一:果然...........+比-慢呢 (var i=0;++i<MAX_VALUE;)还是不如(var i=MAX_VALUE;--i>0;)的快 function loop() { var i=MAX_VALUE = 39999 var st=getTimer() var z=0; var i; while (--i>0) { z ++; } trace(getTimer()-st); }
function loop2() { var i=MAX_VALUE = 39999 var st=getTimer() var z=0; var i; for (;--i>0;) { z ++; } trace(getTimer()-st); }
loop(); loop2();
试验了一下,多于半数的情况下while的稍微快那么一点点点点
回帖二:主要是判断上的缘故 i<0 i<max i<obj.length 这3个判断由上到下越来越慢; --------------------------- 另外理论上,(我没在flash试验过), z++ , ++z , z=z+1 这三种操作, 前两种基本上没有速度的差别,而最后一种最慢.
原贴地址:http://www.blueidea.com/bbs/NewsDetail.asp?id=1057820 仍在讨论中,敬请关注.
讨论三:循环差不多了吧,程序的优化不仅仅是循环哦 在从一个序列、集合里剔除重复的工作,大家都有什么技巧呢? 比如要往一个序列里添加内容,但是又不可以是这个序列里已经有的,也就是说保证这个序列里的内容是不重复的, 最常见的是数组,加入很方便,push进去,但是要判断是否重复了,就很麻烦,一般都是用一个for遍历,逐一对比,但是每push一次都要先做个循环判断,就非常之慢,于是改用object, var xxx={aaa:1,abc:1,ccc:1}; 那我在新加入的时候只要判断if(xxx['ddd']!=1)xxx['ddd']=1,不必再遍历 要取得整个序列也很方便,for(var i in xxx)trace(i+'='+xxx[i])
让高手见笑了
回帖一: 这个做法实在事太好了!思想不错,完全可以避免数组历遍。 在flash里面完全适用,如果对于c++这些需要数组预定义的 语言的话,就要改一下了。不过思想方面应该继承。 佩服佩服
回帖二: 能用object的“键-值”查询的地方当然应该尽量使用,flash里的数组实在太慢了。 一个最有说服力的例子就是,如果要遍历一个数组,比如给所有的项赋值,在没有操作顺序的要求下,用for(...in...)要比for(...;...;...)快的多。这就是因为for in在flash执行的时候采用的是先建立“键-值”枚举表,然后再循环的缘故。
回帖三: 如果插入的是字符串的话,这个方法最好了 不过如果插入的是数字的话,连标标签也用不到 例如插入一个数num 直接if(xxx[num]==1)就行了 利用了flash中数组可以不连续赋值,没被赋值地元素为undefined这一特性 嗬嗬,其实道理和时间复杂度都是一样的 不过不知道这样会不会使空间复杂度增大?
原贴地址:http://www.blueidea.com/bbs/NewsDetail.asp?id=1057820 仍在讨论中,敬请关注.
|