gpt4 book ai didi

javascript - 为什么 Math.imul() 比输入少的常规乘法 (*) 快,输入多时慢?

转载 作者:行者123 更新时间:2023-11-29 10:32:44 26 4
gpt4 key购买 nike

我在尝试使用 Math.imul() 方法,我发现它在输入很少时速度更快,而在输入很多时速度较慢。这是为什么?

(也许它与 Math.imul() 本身无关,但这没关系,我仍然有兴趣了解我得到的结果!)

代码:

const base_multiplier = 40;
const input_counts = [
base_multiplier,
base_multiplier * 10,
base_multiplier * 100,
base_multiplier * 1000
];
for (const input_count of input_counts) {

const value_pairs = Array
.from({ length: input_count })
.map(() => [
Math.round(Math.random() * 100),
Math.round(Math.random() * 100)
])

console.time(`${input_count} inputs | Standart multiplication`);
eval('value_pairs.forEach(([x, y]) => x * y)')
console.timeEnd(`${input_count} inputs | Standart multiplication`);

console.time(`${input_count} inputs | Imul multiplication`);
eval('value_pairs.forEach(([x, y]) => Math.imul(x, y))')
console.timeEnd(`${input_count} inputs | Imul multiplication`);

}

Chrome 控制台的输出:

40 inputs | Standart multiplication: 0.048ms
40 inputs | Imul multiplication: 0.043ms
400 inputs | Standart multiplication: 0.031ms
400 inputs | Imul multiplication: 0.063ms
4000 inputs | Standart multiplication: 0.826ms
4000 inputs | Imul multiplication: 3.604ms
40000 inputs | Standart multiplication: 0.834ms
40000 inputs | Imul multiplication: 0.898ms

节点输出:

40 inputs | Standart multiplication: 0.510ms
40 inputs | Imul multiplication: 0.064ms
400 inputs | Standart multiplication: 0.569ms
400 inputs | Imul multiplication: 0.108ms
4000 inputs | Standart multiplication: 0.172ms
4000 inputs | Imul multiplication: 3.253ms
40000 inputs | Standart multiplication: 0.502ms
40000 inputs | Imul multiplication: 0.762ms

最佳答案

基本的答案是 Math.imul* 的乘法是不一样的,因此不应该像这样进行比较。 Math.imul 执行 32 位整数乘法,但仍必须接受 java 脚本数字作为输入。因此它必须执行额外的操作来转换和/或确保输入是整数。 (参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul)

这意味着 Math.imul(a,b) 接受 Js float 并产生类似于 Math.floor(a) * Math.floor(b)

为了让测试更正确一点,我们可以尝试使用 Uint32 数组,四舍五入 Math.random 结果,确保所有分配都发生在循环的开始,并在结束时计算和以防止 mul操作被编译器优化掉。

结果仍然不明确,我怀疑这归结于这样一个事实,即整数运算带来的 imul 速度增益与转换和函数调用的损失相平衡。而这种平​​衡取决于尺寸。

var base = 40;
var input = [base, base * 10, base * 100, base * 1000];
for (var j = 0; j < input.length; ++j) {
var length = input[j];
var arrayX = new Uint32Array(length);
var arrayY = new Uint32Array(length);
var im = new Uint32Array(length);
var sm = new Uint32Array(length);

for (var i = 0; i < input[j]; ++i) {
arrayX[i] = Math.round(Math.random() * 100);
arrayY[i] = Math.round(Math.random() * 100)
}

console.time(input[j] + ' inputs | Standard multiplication');
for (var i = 0; i < length; ++i) {
sm[i] = arrayX[i] * arrayY[i];
}
console.timeEnd(input[j] + ' inputs | Standard multiplication');

console.time(input[j] + ' inputs | Imul multiplication');
for (var i = 0; i < length; ++i) {
im[i] = Math.imul(arrayX[i], arrayY[i]);
}
console.timeEnd(input[j] + ' inputs | Imul multiplication');

// Prevent multiplication from being optimized away
var sum = 0;
for (var i = 0; i < length; ++i) {
sum += sm[i];
sum += im[i];
}
console.log(sum);
}

在我机器上的 Chrome 中,对于 40000 及以上的输入大小,imul 现在比标准 * 乘法快一点。虽然 4000 大小的案例对于 imul 来说仍然很慢。但是,如果将基数更改为 35,则它们大致相等。如果将基数更改为 55,* 会比 imul 慢得多。

40 inputs | Standard multiplication: 0.120ms
40 inputs | Imul multiplication: 0.035ms
203634
400 inputs | Standard multiplication: 0.045ms
400 inputs | Imul multiplication: 0.050ms
1967184
4000 inputs | Standard multiplication: 0.290ms
4000 inputs | Imul multiplication: 2.935ms
20062298
40000 inputs | Standard multiplication: 0.605ms
40000 inputs | Imul multiplication: 0.450ms
199130538


55 inputs | Standard multiplication: 0.130ms
55 inputs | Imul multiplication: 0.040ms
237716
550 inputs | Standard multiplication: 0.070ms
550 inputs | Imul multiplication: 0.060ms
2638770
5500 inputs | Standard multiplication: 3.175ms
5500 inputs | Imul multiplication: 0.095ms
27218460
55000 inputs | Standard multiplication: 0.850ms
55000 inputs | Imul multiplication: 0.575ms
277160962

关于javascript - 为什么 Math.imul() 比输入少的常规乘法 (*) 快,输入多时慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42353622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com