我最近尝试对多个JavaScript引擎的性能进行基准测试,以检查我编写的排序算法的性能。在此过程中,我偶然发现了无法解释的行为。在V8和Spidermonkey中,毕达哥拉斯函数的计算时间通常与sqrt在同一时间,有时甚至更快!由于sqrt是计算的一部分,因此我认为在进行1000万次迭代后,它应该慢得多……似乎仅在查克拉(pykrago)pythagoras中计算得出的结果要慢3-4秒。
计算机:
当前每个浏览器(Chrome,Firefox和Edge)的最新可用版本
这是我的基准脚本:
var out = document.getElementById("output")
var start, temp,
lat1 = 14, lat2 = 28, lon1 = 12, lon2 = 24,
steps = 10000000
start = Date.now()
for(var i = 0; i < steps; i++) {
temp = Math.sqrt(lat2)
}
out.innerHTML += '<div> sqrt : ' + (Date.now() - start) + '</div>'
// pythagoras
start = Date.now();
for(var i = 0; i < steps; i++) {
temp = Math.sqrt(Math.pow(lat2 - lat1, 2) + Math.pow(lon2 - lon1, 2))
}
out.innerHTML += '<div> pythagoras : ' + (Date.now() - start) + '</div>'
PS:setRandomLatLon()almsot始终需要约122毫秒(至少在V8中)
答案 0 :(得分:0)
感谢建议的解决方案。现在,该测试用例似乎可以正常工作(考虑到它可以产生预期的结果)。
现在的主要更改是使用几乎总是在相同的时间量内执行的函数,在每次迭代中更改使用的经度,经度值。
最终代码(setRandomLatLon在1000万次迭代中以120 ms的时间接收V8):
var out = document.getElementById("output")
var start, temp,
lat1, lat2, lon1, lon2,
steps = 10000000
function setRandomLatLon(){
rand = Math.floor(Math.random()*12);
lat1 = rand + 2
lat2 = rand + 12
lon1 = rand + 4
lon2 = rand + 14
}
// pythagoras
start = Date.now()
for(var i = 0; i < steps; i++) {
setRandomLatLon()
temp = Math.sqrt(lat2)
}
out.innerHTML += '<div> sqrt : ' + (Date.now() - start) + '</div>'
// pythagoras
start = Date.now();
for(var i = 0; i < steps; i++) {
setRandomLatLon()
temp = Math.sqrt(Math.pow(lat2 - lat1, 2) + Math.pow(lon2 - lon1, 2))
}
out.innerHTML += '<div> pythagoras : ' + (Date.now() - start) + '</div>'