javascript - 为什么 sqrt 计算比毕达哥拉斯需要更长的时间?
问题描述
我最近尝试对几个 JavaScript 引擎的性能进行基准测试,以检查我编写的排序算法的性能。在这个过程中,我偶然发现了一种我无法解释的行为。在 V8 和 Spidermonkey 中,pythagoras 函数的计算时间大多与 sqrt 相同,有时甚至更快!由于 sqrt 是计算的一部分,我认为它应该比 10000000 次迭代要慢得多......似乎只有在 Chakra pythagoras 中才会持续计算约慢 3-4 秒。
计算机:
- 操作系统:Win 10 64 位
- CPU:i5-8250U 4核
- 内存: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 中)
解决方案
感谢您提出的解决方案。测试用例现在似乎工作正常(考虑到它产生了预期的结果)。
现在的主要变化是使用几乎总是在相同时间量内执行的函数来改变每次迭代使用的纬度、经度值。
最终代码(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>'
推荐阅读
- ios - React Native DatePickerIOS Rotate Back to Old Date
- java - android studio:创建android启动画面
- react-native - react native navigate and refresh same screen after delete operation
- javascript - JS: Extracting specific text from a string
- gitlab - 在 gitlab-ci 管道上显示徽章或版本号
- java - 我已经构建了一个 WebView 应用程序,但网站下的弹出窗口没有出现
- c++ - dynamic_cast 何时因隐藏符号而失败?
- javascript - 如何使用 Leaflet js 显示多个波段组合?
- sql - 查询以从 mmsql 中表中的最大数生成增量值
- excel - Office Excel 加载项(Web 应用程序)加载/保存文档