谈谈AS中的惰性函数模式(Lazy Function Definition)
最近看了Peter的Javascript的惰性函数定义模式(Lazy Function Definition)之后,想测试下as下的这种函数模式的效率是否比一般的模式要高。不了解此函数定义模式的朋友可以看看这篇文章的翻译。我做了如下测试:
[code]
//普通函数模式
var num = 0;
function test1() {
return num++;
}
//惰性函数模式
var test2 = function () {
var num = 0;
test2 = function () {
return num++;
};
return num++;
};
getTime1();
getTime2();
function getTime1() {
var time = getTimer();
for (var i:Number = 0; i < 1e+5; i++) {
test1();
}
trace("test1调用次数:" + test1());
trace("普通函数模式:" + (getTimer() - time));
}
function getTime2() {
var time = getTimer();
for (var i:Number = 0; i < 1e+5; i++) {
test2();
}
trace("test2调用次数:" + test2());
trace("惰性函数模式:" + (getTimer() - time));
}
[/code]
在我的机器上的测试结果是普通函数模式运行10万次的时间为825ms左右,惰性函数模式则为790ms左右。从效率上来看,2种模式基本差不多,但惰性模式有它的优点:省略了多余的全局变量num,而且可以防止变量num在函数外部被修改,效率方面也有些提升,还是值得使用的。
然而当我想测试as3下是否也这样的时候,却得到了一个惊人结果:普通函数模式运行100万次的时间为110ms左右,惰性函数模式为320ms左右。显然有一个结论是,在as3下,这种惰性函数模式效率比普通模式低了很多,是否要应用这种函数模式就值得商榷了。但是大家看清楚刚才的测试,as2下是10万次而as3下是100万次。。。它们之间的差距我只能用天壤之别来形容了。呵呵,看到这里,是不是让大家更有信心投入到as3的怀抱中呢?