首页 > 解决方案 > 为什么 sqrt 计算比毕达哥拉斯需要更长的时间?

问题描述

我最近尝试对几个 JavaScript 引擎的性能进行基准测试,以检查我编写的排序算法的性能。在这个过程中,我偶然发现了一种我无法解释的行为。在 V8 和 Spidermonkey 中,pythagoras 函数的计算时间大多与 sqrt 相同,有时甚至更快!由于 sqrt 是计算的一部分,我认为它应该比 10000000 次迭代要慢得多......似乎只有在 Chakra 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 中)

标签: javascriptperformance-testing

解决方案


感谢您提出的解决方案。测试用例现在似乎工作正常(考虑到它产生了预期的结果)。

现在的主要变化是使用几乎总是在相同时间量内执行的函数来改变每次迭代使用的纬度、经度值。

最终代码(setRandomLatLon 在 10000000 次迭代中使用 V8 大约 120 毫秒):

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

推荐阅读