Performance: toFixed() vs. Math.floor(x * 10000)
Performance: toFixed() vs. Math.floor(x * 10000)
我需要将两个浮点值比较到一定的精度(即小数点后4位):
var float1 = 0.0025132741228718345;
var float2 = 0.0025132812393818293;
我看到的两个选项:
Math.floor(float1 * 10000) === Math.floor(float2 * 10000); // 25 === 25
或:
float1.toFixed(4) === float2.toFixed(4) // "0.0025" === "0.0025"
由于手术每秒会发生60次,我问自己:
- 哪个选项的性能更高
- 其中一个选项被广泛接受吗
- 还有第三种选择吗
function floor(f1, f2) {
return Math.floor(f1 * 10000) === Math.floor(f2 * 10000);
}
function toFixed(f1, f2) {
return f1.toFixed(4) === f2.toFixed(4);
}
function subtract(f1, f2) {
return Math.abs(f1 - f2) < 0.00001;
}
function test(fn) {
console.time(fn.name);
for (let i = 0; i < 1000000; ++i) {
fn(Math.random(), Math.random());
}
console.timeEnd(fn.name);
}
for (const fn of [floor, toFixed, subtract]) {
test(fn);
}
发动机基准
v8(基于Chromium的浏览器)
- 地板:204.911毫秒
- 至固定时间:4145.529毫秒
- 减法:292.390毫秒
SpiderMonkey(基于Firefox的浏览器)
- 楼层:566.81ms
- 至固定时间:683.56ms
- 减法:423.76ms
在您给出的两个选项中,Math.floor
方法是速度更快的一个。
不过,选择subtract
可能是一个明智的选择。
(如果你不相信我的话,你自己运行这个基准测试。)
快速版本:
function FastFloor(f1, f2) {
return ~~(f1 * 10000) === ~~(f2 * 10000);
}
基准标记:在此处输入链接描述
Math.round(142.89 * 100) / 100 // 142.89
Math.floor(142.89 * 100) / 100 // 142.88
它似乎是基于round函数的toFixed,所以最好使用它来代替
相关文章:
- 控制台中的“function floor(){[本机代码]}”是什么
- Javascript Math.floor 函数失误或实现之谜
- Performance: toFixed() vs. Math.floor(x * 10000)
- 从web服务中检索10000行并插入到OWC11电子表格中
- 为什么当我们把Math.floor写成HTML angular时,它什么也不返回
- Javascript.我一添加math.floor函数,calc()函数就不起作用了
- 为什么Math.floor返回零
- JavaScript:计算斐波那契序列值中所有偶数的总和< 10000
- Math.floor(Math.random()) +1 实际上做了什么
- JavaScript 中的楼层数字:~~n、n|0 或 Math.floor(n)
- 如何使用 PHP 或 JavaScript 请求超过 10000 次的 Steam API
- 函数处理 mootools.floor 不工作
- 浏览器在使用Highcharts绘制超过10000个系列时挂起
- TypeError: Math[“floor”] 不是一个函数
- Math.floor() 对我不起作用
- 如何将一个数字的值增加到10、100、1000、10000的下一个倍数,依此类推
- Math.floor math.random (+ min 在做什么)
- JavaScript:如何解释“Math.floor(Math.rrandom)”方法的变体
- Javascript 整数除法,或者 Math.floor(x) 等价于 x |0 表示 x >= 0
- 如何快速渲染>10000件物品使用React+Flux