我正在尝试确定三种计算方法中的哪一种最快。为了确定这一点,我简单地循环大量调用每个并期望查看分析器以查看每个需要多长时间。
使用 firefox + firebug 和 IE 9 开发工具进行分析可以得出合理的结果,显示每个函数花费了多少时间。但是在谷歌浏览器中,我从来没有在配置文件结果中看到所有三个功能,更糟糕的是,它每次都显示不同的功能,但从来没有全部三个。每次运行分析器时,我都会继续获得不同的外观结果。
我假设分析器可以工作,但我只是不知道如何使用它,但这对我来说确实很糟糕。我在文档中看不到任何解释这种行为的东西。(我使用的是普通版本,但也尝试了开发者版本(版本 26.0.1410.10 dev-m),看看它是否工作得更好 - 它没有。增加循环运行的次数,似乎也没有帮助)
示例 Firebug 结果(按预期显示 3 个函数 + 运行和 onClick):
示例 Chrome 结果 #1(仅显示 3 个中的 1 个):
示例 Chrome 结果 #2(显示 3 个中的 2 个):
正在分析的代码是:
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<button onclick="run()">Run Test</button>
<script type="text/javascript">
var R = 6371,
toRad = Math.PI / 180;
function haversine1(lat1, lon1, lat2, lon2) {
var dLat = (lat2 - lat1) * toRad,
dLon = (lon2 - lon1) * toRad,
a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * toRad) * Math.cos(lat2 * toRad) *
Math.sin(dLon / 2) * Math.sin(dLon / 2),
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return (R * c);
}
function haversine2(lat1, lon1, lat2, lon2) {
lat1 = lat1 * toRad;
lon1 = lon1 * toRad;
lat2 = lat2 * toRad;
lon2 = lon2 * toRad;
var dLat = lat2 - lat1,
dLon = lon2 - lon1,
a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1) * Math.cos(lat2) *
Math.sin(dLon / 2) * Math.sin(dLon / 2),
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return (R * c);
}
function lawOfCosines(lat1, lon1, lat2, lon2) {
lat1 = lat1 * toRad;
lon1 = lon1 * toRad;
lat2 = lat2 * toRad;
lon2 = lon2 * toRad;
return Math.acos(Math.sin(lat1) * Math.sin(lat2) +
Math.cos(lat1) * Math.cos(lat2) *
Math.cos(lon2 - lon1)) * R;
}
function run() {
console.log('Test start');
var lat1 = 90,
lat2 = -90,
lon1 = 180,
lon2 = -180,
i = 0,
x,
y,
z
while (i++ < 1000000) {
lat1 -= .01;
lat2 += .01;
lon1 -= .01;
lon2 += .01;
if (lat1 < -90) lat1 = 90;
if (lat2 > 90) lat2 = -90;
if (lon1 < -180) lon1 = 180;
if (lon2 > 180) lon2 = -180;
x = haversine1(lat1, lon1, lat2, lon2);
y = haversine2(lat1, lon1, lat2, lon2);
z = lawOfCosines(lat1, lon1, lat2, lon2);
if (i % 1000 === 0) {
console.log('x: ' + x + ' y: ' + y + ' z: ' + z);
}
}
console.log('Test end');
}
</script>
</body>
</html>