闲来无事研究一下cocos2dx-lua和cocos2dx-js的性能比较,在做js性能测试的时候发现一些有趣的现象。
var calculateTime = function (name, func) { var times= 0, count=100; for(var i= 0;i<count;i++) { var bt = Date.now(); func(); var et = Date.now(); times += et-bt; } times /= count; cc.log("==================================="); cc.log(name + " use time: " + times); cc.log("==================================="); }; var testPlus = function () { for (var i = 0; i <= 100000; i++) { var x = i+500; } }; var testMultiplication = function () { for (var i = 0; i <= 100000; i++) { var x = i * 500; } }; var testDivision = function () { for (var i = 0; i <= 100000; i++) { var x = i / 500; } }; var testMax = function () { for (var i = 0; i <= 100000; i++) { var x = Math.max(i,500); } }; var testMax2 = function () { for (var i = 0; i <= 100000; i++) { var x = i>500?i:500; } }; var testDisplacement = function () { for (var i = 0; i <= 100000; i++) { var x = i/1000; } }; var testDisplacement2 = function () { for (var i = 0; i <= 100000; i++) { var x = i>>10; } }; calculateTime("testPlus", testPlus); calculateTime("testMultiplication", testMultiplication); calculateTime("testDivision", testDivision); calculateTime("testMax", testMax); calculateTime("testMax2", testMax2); calculateTime("testDisplacement", testDisplacement); calculateTime("testDisplacement2", testDisplacement2);
输出为:
JS: =================================== JS: testPlus use time: 4.77 JS: =================================== JS: =================================== JS: testMultiplication use time: 4.76 JS: =================================== JS: =================================== JS: testDivision use time: 4.68 JS: =================================== JS: =================================== JS: testMax use time: 12.48 JS: =================================== JS: =================================== JS: testMax2 use time: 5.4 JS: =================================== JS: =================================== JS: testDisplacement use time: 4.81 JS: =================================== JS: =================================== JS: testDisplacement2 use time: 4.75 JS: ===================================
比较好奇2个问题,第一,是为什么Math.max会如此的消耗性能,第二,为什么移位运算不比除法运算快?
关于第一个的问题,我进而在测试了一下:
var max = function(x, y) { return x>y?x:y; }; var testMax3 = function () { for (var i = 0; i <= 100000; i++) { var x = max(i, 500); } };
结果是:
JS: =================================== JS: testMax3 use time: 15.34 JS: ===================================
看来时间主要是耗费在函数调用上。
然后,关于第二个问题,查一下资料发现,js计算使用双精度浮点数,若要进行位运算,需要转换成整型,再进行运算,导致效率下降,似乎这个是常识 = =
附上一些链接:
http://www.ruanyifeng.com/blog/2010/01/12_javascript_syntax_structures_you_should_not_use.html
http://jerryzou.com/posts/do-you-really-want-use-bit-operators-in-JavaScript/
时间: 2024-10-04 15:42:31