我正在尝试创建一个自定义的四舍五入函数,可以将数字四舍五入到任何我想要的间隔。例如(如果我正在处理角度,则会四舍五入到最近的15度)。然后我决定测试一下它与Math.round相比速度如何,并发现它更慢。我在FF8上使用firebug。
function R1(a,b){var c=a%b;return a-c+(c/b+1.5>>1)*b}
function R2(a){return Math.round(a)}
var i,e=1e5;
console.time('1');
i=e;
while(i--){
R1(3.5,1);
}
console.timeEnd('1');
console.time('2');
i=e;
while(i--){
R2(3.5);
}
console.timeEnd('2');
我的结果是
1: 464ms
2: 611ms
我以不同的方式运行它们多次,但总是R1的速度更快。也许这只是一个FF浏览器问题,但如果是这样,是什么导致了这种情况。
编辑:我将每个项目从函数调用中取出来,看看会发生什么。
var i,e=1e5,c;
console.time('1');
i=e;
while(i--){
c=3.5%1;
3.5-c+(c/1+1.5>>1)*1;
}
console.timeEnd('1');
console.time('2');
i=e;
while(i--){
Math.round(3.5);
}
console.timeEnd('2');
而且我得到的次数
1: 654ms
2: 349ms
1: 190毫秒 2: 102毫秒
。Windows 上使用 Chrome。 - NullUserExceptionMath.round
包装在另一个函数中与直接声明var R2 = Math.round
有什么不同?在我的情况下(在OS X上使用Safari),我发现前者可以加快速度,尽管此时R2已经比较快了。 - Lily Ballard