FLASH程序优化小结(2)

      :: Flash :: 2004-8-20 15:46
比如有一个数据源数组BBB……length为10000……将一个目标变量对该数组进行比较操作时……比如判断变量A的值是否在数组里存在……
正常的做法是:
for(var i in BBB){if (bbb[i]==a){return true;}}
也就是要执行一万次的if判断……
下面是我用的算法:
var CCC=BBB.join();
if(CCC.indexOf(A))return true;

结论:
FLASH中提供了字符串查询的函数indexOf,却没有提供数组的检索函数……
通常情况下……字符串查询的效率要比数组(for in)快许多倍……原因是用的算法不同……即字符串查询函数用了优化的算法……查询一万个元素,只要循环十四次就搞定,即对拆算法(土名)……同理……我们可以自己编写一套数组查询的算法……


以下是编写的算法……查询一万个数据只需1毫秒,数组长度越大……效果越明显……各位大侠评评……
var myarray = new Array();
for (var i = 10000; --i>0; ) {
    myarray.push(i);
}
myarray.sort();
//生成数组并进行排序……这一步可在程序中完成……亦可在导入数组前先排序好……
function Array_indexOf(x, y) {
var i = 0;
var 总长度 = y.length;
var 当前第几个 = 当前循环数=int(总长度/2);
x = String(x);
while (true) {
    i++;
    if (当前循环数<1) {
        return trace("没找到,循环了"+i+"次");
    } else if (x == String(y[当前第几个])) {
        return trace("找到了,在排序后的数组中ID号为:"+当前第几个+",循环了"+i+"次");
    } else {
    当前循环数 = 当前循环数%2>0 ? int(当前循环数/2)+1 : 当前循环数/2;
    当前第几个 = (x>String(y[当前第几个])) ? 当前第几个+当前循环数 : 当前第几个-当前循环数;
        }
    }
}
var time = getTimer();
Array_indexOf(998, myarray);
trace("查询总共耗时:"+(getTimer()-time)+" 毫秒");


以上方法适用于数组单元为字符串类型的……稍加修改亦可应用于数字类型的数据……
在数组的排序算法中……FLASH MX未直接提供数字排序……而FLASH MX2004可以用Array.NUMERIC的参数对数组进行排序……MX中的排序算法很奇妙……对此有研究者不妨谈谈使用的经验……

关于xml
没有人会用for循环去读XML吧?

使用for循环读取,每一次都是从XML树根去寻找某一个叶子
这样XML的优势就荡然无存了,尤其是当树的高度很大时,效率更加低下
但使用next & prev这类的方法时,是在兄弟之间进行遍历
无需每一次都返回树根,效率当然高

通常使用abc[0].tt[0]这样的方式都是进行随机访问
如果连遍历都用for的话,那不单不能发挥XML的优势
而且效率反而还不如字符串方式高呢


实际制作中,如果使用组件的话,注意这一点也能大大提高效率:
for (var i = 0; i < 100; i++)
{
comboBox.addItemAt({aa:123,bb:234,cc:345,dd:456};);
}
这种方法的效率是非常低的
用这种方法可以提高的多
var tmp = new Array();
for (var i = 0; i < 100; i++)
{
tmp.push({aa:123,bb:234,cc:345,dd:456});
}
comboBox.dataProvider = tmp;

类似的,DataGrid,List,DataSet等,都有这个问题.


标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}