(un|)pack(21|32|35) vs. toString/parseInt

Benchmark created by Devyn Cairns on


Preparation HTML

<script>
  function pack32(num) {
    return String.fromCharCode(num >> 16) + String.fromCharCode(num & 65535);
  }
  
  function unpack32(str) {
    return (str.charCodeAt(0)<<16) + str.charCodeAt(1);
  }
  
  function pack35(num) {
    var i1 = num >> 28;
    var r1 = num &  268435455;
    var i2 = r1  >> 21;
    var r2 = r1  &  2097151;
    var i3 = r2  >> 14;
    var r3 = r2  &  16383;
    var i4 = r3  >> 7;
    var r4 = r3  &  127;
    return String.fromCharCode(i1) + String.fromCharCode(i2) + String.fromCharCode(i3) + String.fromCharCode(i4) + String.fromCharCode(r4);
  }
  
  function unpack35(str) {
    return str.charCodeAt(0)*268435456 + str.charCodeAt(1)*2097152 + str.charCodeAt(2)*16384  + str.charCodeAt(3)*128 + str.charCodeAt(4);
  }
  
  function pack21(num) {
    var i1 = num >> 14;
    var r1 = num &  16383;
    var i2 = r1  >> 7;
    var r2 = r1  &  127;
    return String.fromCharCode(i1) + String.fromCharCode(i2) + String.fromCharCode(r2);
  }
  
  function unpack21(str) {
    return str.charCodeAt(0)*16384 + str.charCodeAt(1)*128 + str.charCodeAt(2);
  }
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
toString/parseInt
parseInt(126000..toString(),10);
ready
pack32/unpack32
unpack32(pack32(126000));
ready
unpack32
unpack32("\u0001\uec30");
ready
parseInt
parseInt("126000",10);
ready
or zero
"126000" | 0;
ready
pack32
pack32(126000);
ready
toString
126000..toString();
ready
pack35/unpack35
unpack35(pack35(126000));
ready
pack35
pack35(126000);
ready
unpack35
unpack35("\u0000\u0000\u0007Ϙ0");
ready
pack21/unpack21
unpack21(pack21(126000));
ready
pack21
pack21(126000);
ready
unpack21
unpack21("\u0007X0");
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.

  • Revision 1: published by Devyn Cairns on