Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
Run results for:
Buffer Access 2
Go to the benchmark
Embed
Embed Benchmark Result
Run details:
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0
Browser:
Firefox 135
Operating system:
Mac OS X 10.15
Device Platform:
Desktop
Date tested:
one year ago
Test name
Executions per second
DataView AoS
25.8 Ops/sec
DataView byte-aligned AoS
25.9 Ops/sec
TypedArray byte-aligned AoS
494.8 Ops/sec
TypeArray SoA
1117.3 Ops/sec
Script Preparation code:
var bench1buffer; var bench2buffer; var bench3buffer; var size = 1_000_000; { const stride = 10; bench1buffer = new ArrayBuffer(stride * size); /* 0 u16 id 2 f32 x 6 f32 y */ for (let i = 0; i < size; i++) { const struct = new DataView(bench1buffer, i * stride, stride); struct.setUint16(0, i, true); struct.setFloat32(2, i, true); struct.setFloat32(6, i * 2, true); } } { const stride = 12; bench2buffer = new ArrayBuffer(stride * size); /* 0 u16 id 4 f32 x 8 f32 y */ for (let i = 0; i < size; i++) { const struct = new DataView(bench2buffer, i * stride, stride); struct.setUint16(0, i, true); struct.setFloat32(4, i, true); struct.setFloat32(8, i * 2, true); } } { bench3buffer = { id: new Uint16Array(size), x: new Float32Array(size), y: new Float32Array(size), }; for (let i = 0; i < size; i++) { bench3buffer.id[i] = i; bench3buffer.x[i] = i; bench3buffer.y[i] = i * 2; } }
Tests:
DataView AoS
const stride = 10; /* 0 u16 id 2 f32 x 6 f32 y */ let sum = 0; for (let i = 0; i < size; i++) { const struct = new DataView(bench1buffer, i * stride, stride); const id = struct.getUint16(0, true); const x = struct.getFloat32(2, true); const y = struct.getFloat32(6, true); sum += id + x * y; } console.log(1, sum);
DataView byte-aligned AoS
const stride = 12; /* 0 u16 id 4 f32 x 8 f32 y */ let sum = 0; for (let i = 0; i < size; i++) { const struct = new DataView(bench2buffer, i * stride, stride); const id = struct.getUint16(0, true); const x = struct.getFloat32(4, true); const y = struct.getFloat32(8, true); sum += id + x * y; } console.log(2, sum);
TypedArray byte-aligned AoS
const stride = 12; /* 0 u16 id 4 f32 x 8 f32 y */ const f32s = new Float32Array(bench2buffer); const u16s = new Uint16Array(bench2buffer); let sum = 0; for (let i = 0; i < size; i++) { const offset = i * stride; const id = u16s[offset / 2]; const x = f32s[offset / 4 + 1]; const y = f32s[offset / 4 + 2]; sum += id + x * y; } console.log(3, sum);
TypeArray SoA
let sum = 0; for (let i = 0; i < size; i++) { const id = bench3buffer.id[i]; const x = bench3buffer.x[i]; const y = bench3buffer.y[i]; sum += id + x * y; } console.log(3, sum);