Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@letmaik
Created July 26, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save letmaik/71dd7fd98e960b237c6f to your computer and use it in GitHub Desktop.
Save letmaik/71dd7fd98e960b237c6f to your computer and use it in GitHub Desktop.
Performance of DataView vs inline code for little/big endian conversion (inline wins)
<!doctype html>
<html>
<body>
DataView: <span id="time_dataview"></span><br />
Inline: <span id="time_inline"></span>
<script>
var littleEndian = (function() {
var buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 256, true);
return new Int16Array(buffer)[0] === 256;
})();
console.log('little endian: ' + littleEndian)
// create test data, 100MiB, assuming big endian float32's
var len = 26214400
var buf = new ArrayBuffer(len*4)
// Approach A: DataView
var t0 = new Date()
for (var n=0; n<10; n++) {
// convert floats in buffer to little endian
var dv = new DataView(buf)
for (var i=0; i<len+4; i+=4) {
dv.setFloat32(i, dv.getFloat32(i, false))
}
}
var t1 = new Date()
var t = ((t1-t0)/10).toFixed(2)
document.getElementById('time_dataview').innerHTML = t;
console.log('convert_endian_dataview: ' + t + 'ms')
// Approach B: inlined code
var t0 = new Date()
var bytes = new Uint8Array(buf)
for (var n=0; n<10; n++) {
// convert floats in buffer to little endian
var holder;
for (var i=0; i<len+4; i+=4) {
holder = bytes[i];
bytes[i] = bytes[i+3];
bytes[i+3] = holder;
holder = bytes[i+1];
bytes[i+1] = bytes[i+2];
bytes[i+2] = holder;
}
}
var t1 = new Date()
var t = ((t1-t0)/10).toFixed(2)
document.getElementById('time_inline').innerHTML = t;
console.log('convert_endian_inline: ' + t + 'ms')
// now we can create a typed array
var ta = new Float32Array(buf)
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment