patternjavascriptMinor
Bit compressing in JavaScript
Viewed 0 times
javascriptbitcompressing
Problem
I have an bit array
jsPerf
Because this is a bottleneck, I need the fastest cross-browser solution in my code, can anybody help make it any faster?
Also,
It can be algorithm optimization or syntax optimization (such as asm.js) or something else. Should I change the array type (
var data = []; ... and I have the following function:jsPerf
function getBit(n) {
return (data[~~(n / 32)] >> (n % 32)) & 1;
}Because this is a bottleneck, I need the fastest cross-browser solution in my code, can anybody help make it any faster?
Also,
~~(n / 32) === Math.floor(n / 32)It can be algorithm optimization or syntax optimization (such as asm.js) or something else. Should I change the array type (
typedArray or similar)?Solution
I tried to speed up your formula :
.... All results are very close anyway : jsperf.com/fastest-bit-compressing/7.
• notice that you can inline the function by yourself (replace function call by direct computation).
• you might wan to cache latest array access by yourself during your computations.
• Or you might want to do the caching in the function. Efficiency will depends on the 'randomness' of your
use of the bits.
return (data[n >> 5] >> (n & 31)) & 1;.... All results are very close anyway : jsperf.com/fastest-bit-compressing/7.
• notice that you can inline the function by yourself (replace function call by direct computation).
• you might wan to cache latest array access by yourself during your computations.
• Or you might want to do the caching in the function. Efficiency will depends on the 'randomness' of your
use of the bits.
function getBit(n) {
var itemIndex = n >> 5;
if (itemIndex != lastItemIndex ) {
lastItem = data[itemIndex];
lastItemIndex = itemIndex ;
}
return lastItem >> (n & 31)) & 1;
}
var lastItemIndex = -1, lastItem = 0;Code Snippets
return (data[n >> 5] >> (n & 31)) & 1;function getBit(n) {
var itemIndex = n >> 5;
if (itemIndex != lastItemIndex ) {
lastItem = data[itemIndex];
lastItemIndex = itemIndex ;
}
return lastItem >> (n & 31)) & 1;
}
var lastItemIndex = -1, lastItem = 0;Context
StackExchange Code Review Q#57217, answer score: 2
Revisions (0)
No revisions yet.