为什么sqrt计算需要比毕达哥拉斯更长的时间?

时间:2018-10-11 10:43:44

标签: javascript performance-testing

我最近尝试对多个JavaScript引擎的性能进行基准测试,以检查我编写的排序算法的性能。在此过程中,我偶然发现了无法解释的行为。在V8和Spidermonkey中,毕达哥拉斯函数的计算时间通常与sqrt在同一时间,有时甚至更快!由于sqrt是计算的一部分,因此我认为在进行1000万次迭代后,它应该慢得多……似乎仅在查克拉(pykrago)pythagoras中计算得出的结果要慢3-4秒。

计算机:

  • 操作系统:Win 10 64位
  • CPU:i5-8250U 4核
  • RAM:8 GB

当前每个浏览器(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中)

1 个答案:

答案 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>'