jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
class Mat4 {
/**
* Matrix elements in the form of a flat array.
*
* @type {Float32Array}
*/
data = new Float32Array(16);
/**
* Create a new Mat4 instance. It is initialized to the identity matrix.
*/
constructor() {
// Create an identity matrix. Note that a new Float32Array has all elements set
// to zero by default, so we only need to set the relevant elements to one.
this.data[0] = this.data[5] = this.data[10] = this.data[15] = 1;
}
mul2(lhs, rhs) {
const a = lhs.data;
const b = rhs.data;
const r = this.data;
const a00 = a[0];
const a01 = a[1];
const a02 = a[2];
const a03 = a[3];
const a10 = a[4];
const a11 = a[5];
const a12 = a[6];
const a13 = a[7];
const a20 = a[8];
const a21 = a[9];
const a22 = a[10];
const a23 = a[11];
const a30 = a[12];
const a31 = a[13];
const a32 = a[14];
const a33 = a[15];
let b0, b1, b2, b3;
b0 = b[0];
b1 = b[1];
b2 = b[2];
b3 = b[3];
r[0] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[1] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[2] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[3] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
b0 = b[4];
b1 = b[5];
b2 = b[6];
b3 = b[7];
r[4] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[5] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[6] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[7] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
b0 = b[8];
b1 = b[9];
b2 = b[10];
b3 = b[11];
r[8] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[9] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[10] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[11] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
b0 = b[12];
b1 = b[13];
b2 = b[14];
b3 = b[15];
r[12] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[13] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[14] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[15] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
return this;
}
mul2opt(lhs, rhs) {
const a = lhs.data;
const b = rhs.data;
const r = this.data;
const a00 = a[0];
const a01 = a[1];
const a02 = a[2];
const a03 = a[3];
const a10 = a[4];
const a11 = a[5];
const a12 = a[6];
const a13 = a[7];
const a20 = a[8];
const a21 = a[9];
const a22 = a[10];
const a23 = a[11];
const a30 = a[12];
const a31 = a[13];
const a32 = a[14];
const a33 = a[15];
r[0] = a00 * b[0] + a10 * b[1] + a20 * b[2] + a30 * b[3];
r[1] = a01 * b[0] + a11 * b[1] + a21 * b[2] + a31 * b[3];
r[2] = a02 * b[0] + a12 * b[1] + a22 * b[2] + a32 * b[3];
r[3] = a03 * b[0] + a13 * b[1] + a23 * b[2] + a33 * b[3];
r[4] = a00 * b[4] + a10 * b[5] + a20 * b[6] + a30 * b[7];
r[5] = a01 * b[4] + a11 * b[5] + a21 * b[6] + a31 * b[7];
r[6] = a02 * b[4] + a12 * b[5] + a22 * b[6] + a32 * b[7];
r[7] = a03 * b[4] + a13 * b[5] + a23 * b[6] + a33 * b[7];
r[8] = a00 * b[8] + a10 * b[9] + a20 * b[10] + a30 * b[11];
r[9] = a01 * b[8] + a11 * b[9] + a21 * b[10] + a31 * b[11];
r[10] = a02 * b[8] + a12 * b[9] + a22 * b[10] + a32 * b[11];
r[11] = a03 * b[8] + a13 * b[9] + a23 * b[10] + a33 * b[11];
r[12] = a00 * b[12] + a10 * b[13] + a20 * b[14] + a30 * b[15];
r[13] = a01 * b[12] + a11 * b[13] + a21 * b[14] + a31 * b[15];
r[14] = a02 * b[12] + a12 * b[13] + a22 * b[14] + a32 * b[15];
r[14] = a03 * b[12] + a13 * b[13] + a23 * b[14] + a33 * b[15];
}
}
class Mat4Fast {
/**
* Matrix elements in the form of a flat array.
*
* @type {Float32Array}
*/
data = [
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
];
mul2(lhs, rhs) {
const a = lhs.data;
const b = rhs.data;
const r = this.data;
const a00 = a[0];
const a01 = a[1];
const a02 = a[2];
const a03 = a[3];
const a10 = a[4];
const a11 = a[5];
const a12 = a[6];
const a13 = a[7];
const a20 = a[8];
const a21 = a[9];
const a22 = a[10];
const a23 = a[11];
const a30 = a[12];
const a31 = a[13];
const a32 = a[14];
const a33 = a[15];
let b0, b1, b2, b3;
b0 = b[0];
b1 = b[1];
b2 = b[2];
b3 = b[3];
r[0] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[1] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[2] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[3] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
b0 = b[4];
b1 = b[5];
b2 = b[6];
b3 = b[7];
r[4] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[5] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[6] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[7] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
b0 = b[8];
b1 = b[9];
b2 = b[10];
b3 = b[11];
r[8] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[9] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[10] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[11] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
b0 = b[12];
b1 = b[13];
b2 = b[14];
b3 = b[15];
r[12] = a00 * b0 + a10 * b1 + a20 * b2 + a30 * b3;
r[13] = a01 * b0 + a11 * b1 + a21 * b2 + a31 * b3;
r[14] = a02 * b0 + a12 * b1 + a22 * b2 + a32 * b3;
r[15] = a03 * b0 + a13 * b1 + a23 * b2 + a33 * b3;
return this;
}
mul2opt(lhs, rhs) {
const a = lhs.data;
const b = rhs.data;
const r = this.data;
const a00 = a[0];
const a01 = a[1];
const a02 = a[2];
const a03 = a[3];
const a10 = a[4];
const a11 = a[5];
const a12 = a[6];
const a13 = a[7];
const a20 = a[8];
const a21 = a[9];
const a22 = a[10];
const a23 = a[11];
const a30 = a[12];
const a31 = a[13];
const a32 = a[14];
const a33 = a[15];
r[0] = a00 * b[0] + a10 * b[1] + a20 * b[2] + a30 * b[3];
r[1] = a01 * b[0] + a11 * b[1] + a21 * b[2] + a31 * b[3];
r[2] = a02 * b[0] + a12 * b[1] + a22 * b[2] + a32 * b[3];
r[3] = a03 * b[0] + a13 * b[1] + a23 * b[2] + a33 * b[3];
r[4] = a00 * b[4] + a10 * b[5] + a20 * b[6] + a30 * b[7];
r[5] = a01 * b[4] + a11 * b[5] + a21 * b[6] + a31 * b[7];
r[6] = a02 * b[4] + a12 * b[5] + a22 * b[6] + a32 * b[7];
r[7] = a03 * b[4] + a13 * b[5] + a23 * b[6] + a33 * b[7];
r[8] = a00 * b[8] + a10 * b[9] + a20 * b[10] + a30 * b[11];
r[9] = a01 * b[8] + a11 * b[9] + a21 * b[10] + a31 * b[11];
r[10] = a02 * b[8] + a12 * b[9] + a22 * b[10] + a32 * b[11];
r[11] = a03 * b[8] + a13 * b[9] + a23 * b[10] + a33 * b[11];
r[12] = a00 * b[12] + a10 * b[13] + a20 * b[14] + a30 * b[15];
r[13] = a01 * b[12] + a11 * b[13] + a21 * b[14] + a31 * b[15];
r[14] = a02 * b[12] + a12 * b[13] + a22 * b[14] + a32 * b[15];
r[14] = a03 * b[12] + a13 * b[13] + a23 * b[14] + a33 * b[15];
}
}
const m1 = new Mat4();
const m2 = new Mat4();
const m3 = new Mat4();
const f1 = new Mat4Fast();
const f2 = new Mat4Fast();
const f3 = new Mat4Fast();
Ready to run.
Test | Ops/sec | |
---|---|---|
Float32Array constructor |
| ready |
Array constructor |
| ready |
Float32Array mul |
| ready |
Array mul |
| ready |
Float32Array mul opt |
| ready |
Array mul opt |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.