Created
May 18, 2023 11:05
-
-
Save Qqwy/23281fd842768138711bcd57e7b2a80a to your computer and use it in GitHub Desktop.
Comparison of 32-bit multiplication in JS (http://jsbench.github.io/#23281fd842768138711bcd57e7b2a80a) #jsbench #jsperf
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"/> | |
<title>Comparison of 32-bit multiplication in JS</title> | |
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script> | |
<script src="./suite.js"></script> | |
</head> | |
<body> | |
<h1>Open the console to view the results</h1> | |
<h2><code>cmd + alt + j</code> or <code>ctrl + alt + j</code></h2> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
(function (factory) { | |
if (typeof Benchmark !== "undefined") { | |
factory(Benchmark); | |
} else { | |
factory(require("benchmark")); | |
} | |
})(function (Benchmark) { | |
var suite = new Benchmark.Suite; | |
Benchmark.prototype.setup = function () { | |
function imulPolyfill(a, b) { | |
var ah = (a >>> 16) & 0xffff; | |
var al = a & 0xffff; | |
var bh = (b >>> 16) & 0xffff; | |
var bl = b & 0xffff; | |
// the shift by 0 fixes the sign on the high part | |
// the final |0 converts the unsigned value into a signed value | |
return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0); | |
}; | |
function randomInt(min, max) { | |
min = Math.ceil(min); | |
max = Math.floor(max); | |
return Math.floor(Math.random() * (max - min) + min); // The maximum is exclusive and the minimum is inclusive | |
} | |
var min_int32 = -2147483648; | |
var max_int32 = 2147483647; | |
var a = []; | |
var b = []; | |
var res = []; | |
var count = 1000; | |
for(var i = 0; i < count; ++i) { | |
a.push(randomInt(min_int32, max_int32)); | |
b.push(randomInt(min_int32, max_int32)); | |
} | |
}; | |
suite.add("res = [];", function () { | |
res = []; | |
for(var i = 0; i < count; ++i){ | |
res.push((a[i] * b[i]) | 0); | |
} | |
}); | |
suite.add("res = [];", function () { | |
res = []; | |
for(var i = 0; i < count; ++i){ | |
res.push(Math.imul(a[i], b[i])); | |
} | |
}); | |
suite.add("res = [];", function () { | |
res = []; | |
for(var i = 0; i < count; ++i){ | |
res.push(((a[i] | 0) * (b[i] | 0)) | 0); | |
} | |
}); | |
suite.add("res = [];", function () { | |
res = []; | |
for(var i = 0; i < count; ++i){ | |
res.push(imulPolyfill(a[i], b[i])); | |
} | |
}); | |
suite.on("cycle", function (evt) { | |
console.log(" - " + evt.target); | |
}); | |
suite.on("complete", function (evt) { | |
console.log(new Array(30).join("-")); | |
var results = evt.currentTarget.sort(function (a, b) { | |
return b.hz - a.hz; | |
}); | |
results.forEach(function (item) { | |
console.log((idx + 1) + ". " + item); | |
}); | |
}); | |
console.log("Comparison of 32-bit multiplication in JS"); | |
console.log(new Array(30).join("-")); | |
suite.run(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment