同时,一些基本的算法上的优化,同样可以用在JavaScript中,比如运算结构的调整,这里就不再赘述了。但是由于JavaScript是解释型的,一般不会在运行时对字节码进行优化,所以这些优化仍然是很重要的。
当然,其实这里的一些技巧同样使用在其他的一些解释型语言中,大家也可以进行参考。
由于是以前做过的测试,测试代码已经不全,我补充了一部分如下:
var print; if(typeof document != "undefined" ){ print = function(){ document.write(arguments[0]); } }else if(typeof WScript != "undefined" ){ print = function(){ WScript.Echo(arguments[0],arguments[1],arguments[2]); } } function empty(){ } function benchmark(f){ var i = 0; var start = (new Date()).getTime(); while(i < pressure){ f(i++); } var end = (new Date()).getTime(); WScript.Echo(end-start); } /* i=0 start = (new Date()).getTime(); while(i < 60000){ c = [i,i,i,i,i,i,i,i,i,i]; i++; } end = (new Date()).getTime(); WScript.Echo(end-start); i=0 start = (new Date()).getTime(); while(i < 60000){ c = new Array(i,i,i,i,i,i,i,i,i,i); i++; } var end = (new Date()).getTime(); WScript.Echo(end-start); */ function internCast(i){ return "" + i; } function StringCast(i){ return String(i) } function newStringCast(i){ return new String(i) } function toStringCast(i){ return i.toString(); } function ParseInt(){ return parseInt(j); } function MathFloor(){ return Math.floor(j); } function Floor(){ return floor(j); } var pressure = 50000; var a = ""; var floor = Math.floor; j = 123.123; print("-------------\nString Conversion Test"); print("The empty:", benchmark(empty)); print("intern:", benchmark(internCast)); print("String:"); benchmark(StringCast); print("new String:"); benchmark(newStringCast); print("toString:"); benchmark(toStringCast); print("-------------\nFloat to Int Conversion Test"); print("parseInt"); benchmark(ParseInt); print("Math.floor"); benchmark(MathFloor); print("floor") benchmark(Floor); function newObject(){ return new Object(); } function internObject(){ return {}; } print("------------\nliteral Test"); print("runtime new object", benchmark(newObject)); print("literal object", benchmark(internObject));
附录2
代码1:
for(var i=0;i<100;i++){ arr[i]=0; }
代码2:
var i = 0; while(i < 100){ arr[i++]=0; }
代码3:
var i = 0; while(i < 100){ arr[i]=0; i++; }
在firefox下测试这两段代码,结果是代码2优于代码1和3,而代码1一般优于代码3,有时会被代码3超过;而在IE 6.0下,测试压力较大的时候(如测试10000次以上)代码2和3则有时候优于代码1,有时候就会远远落后代码1,而在测试压力较小(如5000次),则代码2>代码3>代码1。
代码4:
var i = 0; var a; while(i < 100){ a = 0; i++; }
代码5:
var a; for(var i=0;i<100;i++){ a = 0; }
上面两段代码在Firefox和IE下测试结果都是性能接近的。
代码6:
var a; var i=0; while(i<100){ a=i; i++; }
代码7:
var a; var i=0; while(i<100){ a=i++; }
代码8:
var a; for(var i=0;i<100;i++){ a = i; }
代码9:
var a; for(var i=0;i<100;){ a = i++; }
这四段代码在Firefox下6和8的性能接近,7和9的性能接近,而6, 8 < 7, 9;
最后我们来看一下空循环
代码10:
for(var i=0;i<100;i++){ }
代码11:
var i; while(i<100){ i++; }
最后的测试出现了神奇的结果,Firefox下代码10所花的时间与代码11所花的大约是24:1。所以它不具备参考价值,于是我没有放在一开始给大家看。
您可能感兴趣的文章: