通常我们在做代码性能测试时,会在开始时获取一个时间戳,然后执行要测试的代码,在结束时再获取一个时间戳,然后两个时间戳相减得出代码执行消耗的时间。这种方法理论上可行,但结果并不总是准确的,特别是被执行的代码只有几毫秒执行时间的情况下。系统上运行的其他进程可能会导致结果偏差。更好的方法是让被测试的代码在单位时间(如1秒)内循环运行,然后统计单位时间内完成的循环次数来评价代码性能,可以重复测试来获取均值或中值。这些测试会运行相同的时间,更优的代码会完成更多的循环。
常见的单次执行式的测试方法:
var startTime = new Date().getTime(); //在这里执行代码 runtest(); var timeElapsed = new Date().getTime() - startTime; //执行代码消耗的时间
单位时间循环执行式的测试方法:
var startTime = new Date().getTime(), count, timeElapsed; for(count = 0, timeElapsed = 0; timeElapsed < 1000; count++){ //在这里执行代码 test(); timeElapsed = new Date().getTime() - startTime; } //最终count为循环执行的次数
比如测试 Math.random()*255>>0 和 parseInt(Math.random()*255),这两个都是对数值取整,通常在设置随机颜色(rgb(255,255,255))时会用到,“>>”是算术位右移,可以去掉小数部分。
编写如下测试代码:
<!DOCTYPE HTML> <html> <head> <style type="text/css"> </style> <script type="text/javascript"> function runtest(func){ var startTime = new Date().getTime(), count, timeElapsed; for(count = 0, timeElapsed = 0; timeElapsed < 1000; count++){ func(); timeElapsed = new Date().getTime() - startTime; } addResult(); function addResult(){ var li = document.createElement('li'); li.innerHTML = count; document.getElementById('test_result').appendChild(li); } } /* your test code here */ function test1(){ var num = Math.random()*255>>0; } function test2(){ var num = parseInt(Math.random()*255); } </script> </head> <body> <button onclick="runtest(test1)">run test1</button> <button onclick="runtest(test2)">run test2</button> <ol id="test_result"> </ol> </body> </html>
分别测试5次的结果:
测试Math.random()*255>>0 的结果
4359444
4339976
4324491
4218870
4339112
测试parseInt(Math.random()*255)的结果
3619779
3713368
3639922
3629729
3661628
可以看出第一种方法比第二种更快,在大数据量处理情况下,选择第一种更好。