我试图对“缓存”math.floor的获取/丢失进行基准测试,希望能够更快地拨打电话。
以下是测试:
<html>
<head>
<script>
window.onload = function()
{
var startTime = new Date().getTime();
var k = 0;
for(var i = 0; i < 1000000; i++) k += Math.floor(9.99);
var mathFloorTime = new Date().getTime() - startTime;
startTime = new Date().getTime();
window.mfloor = Math.floor;
k = 0;
for(var i = 0; i < 1000000; i++) k += window.mfloor(9.99);
var globalFloorTime = new Date().getTime() - startTime;
startTime = new Date().getTime();
var mfloor = Math.floor;
k = 0;
for(var i = 0; i < 1000000; i++) k += mfloor(9.99);
var localFloorTime = new Date().getTime() - startTime;
document.getElementById("MathResult").innerHTML = mathFloorTime;
document.getElementById("globalResult").innerHTML = globalFloorTime;
document.getElementById("localResult").innerHTML = localFloorTime;
};
</script>
</head>
<body>
Math.floor: <span id="MathResult"></span>ms <br />
var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />
</body>
</html>
我的测试结果:
[Chromium 5.0.308.0]:
Math.floor: 49ms
var mathfloor: 271ms
window.mathfloor: 40ms
[IE 8.0.6001.18702]
Math.floor: 703ms
var mathfloor: 9890ms [LOL!]
window.mathfloor: 375ms
[Firefox [Minefield] 3.7a4pre]
Math.floor: 42ms
var mathfloor: 2257ms
window.mathfloor: 60ms
[Safari 4.0.4[531.21.10] ]
Math.floor: 92ms
var mathfloor: 289ms
window.mathfloor: 90ms
[Opera 10.10 build 1893]
Math.floor: 500ms
var mathfloor: 843ms
window.mathfloor: 360ms
[Konqueror 4.3.90 [KDE 4.3.90 [KDE 4.4 RC1]]]
Math.floor: 453ms
var mathfloor: 563ms
window.mathfloor: 312ms
当然,方差是随机的,但大部分是
在所有情况下[显示时间]:
[需要更长时间] mathfloor&gt; Math.floor&gt; window.mathfloor [更快]
这是为什么?在我的项目中,我一直在使用var mfloor = Math.floor
,根据我不那么惊人的基准测试,我“优化”的努力实际上减缓了ALOT的脚本......
还有其他方法让我的代码更“高效”......?我正处于基本需要优化的阶段,所以不,这不是“过早优化”......
答案 0 :(得分:2)
您将这两个变量标记错误:
var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />
@David的替代品值得研究,还有某种记忆。
答案 1 :(得分:0)
我不确定为什么你的基准会做他们做的事情。
但是如果你打算经常调用Math.floor,你可以使用它:
var num = 9.99;
var floored = ~~num; // 9
并非~~
可能会失败字符串(var num = "9.99"
),数字超出32位范围,负数(~~
将会向上舍入)。
有关详情,请参阅this question。
<强>更新强>
这是modified benchmark
在Chrome上,我得到的本地范围比Math.floor和全局范围更快。 (window.mfloor)请注意,我没有像原始基准中那样使用window.
语法引用全局mfloor。
所以,我认为你的测试有2个问题(除了在其他答案中提到的变量名称混淆)。一个是你在window.mfloor上运行循环,另一个是你有一个与全局变量同名的局部变量(这只是推测)。
使用我发布的jsbin链接尝试基准测试并回复我。
这是我懒惰的基准:
window.onload = function(){
var k = 0, i=0, n = 2000000,
startTime = +(new Date);
for(; i < n; ++i) k += Math.floor(9.99);
var mathFloorTime = (new Date) - startTime;
window.globalMfloor = Math.floor;
k = i = 0;
startTime = +(new Date);
for(; i < n; ++i) k += globalMfloor(9.99);
var globalFloorTime = (new Date) - startTime;
var mfloor = Math.floor;
k = i = 0;
startTime = +(new Date);
for(; i < n; ++i) k += mfloor(9.99);
var localFloorTime = (new Date) - startTime;
alert("Math.floor: " + mathFloorTime);
alert("globalMfloor: " + globalFloorTime);
alert("mfloor: " + localFloorTime);
};
答案 2 :(得分:0)
编辑:哎呀,我没有看到有关字段名称混淆的答案。事实证明,在Firefox中,访问本地变量比访问Math.floor更快(占用80%),但访问全局变量需要花费140%的时间。
在我的原始答案中,我假设局部变量比全局变量更难访问,因为闭包处理等等。然而,它似乎是另一种方式。