Skip to content

Instantly share code, notes, and snippets.

@JobLeonard
Last active March 29, 2023 11:01
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 JobLeonard/0f3258897593e4572a6b441f562e48e6 to your computer and use it in GitHub Desktop.
Save JobLeonard/0f3258897593e4572a6b441f562e48e6 to your computer and use it in GitHub Desktop.
Bit Array iterator test (random bits initialized every test)
{"title":"Bit Array iterator test (random bits initialized every test)","initialization":"class BitArrayU8 {\n constructor(length) {\n this.bits = new Uint8Array(Math.ceil(length / 8));\n this.length = length;\n }\n\n set(i) {\n this.bits[i >> 3] |= (1 << (i & 7));\n }\n\n at(i) {\n return (this.bits[i >> 3] & (1 << (i & 7))) ? true : false;\n }\n\n fill(bool) {\n this.bits.fill(bool ? 255 : 0);\n }\n \n forEach(cb) {\n const {bits, length} = this;\n for(let i = 0; i < length; i++) {\n cb((bits[i >> 3] & (1 << (i & 7))) ? true : false, i, bits);\n }\n }\n \n [Symbol.iterator]() {\n let i = 0;\n const {bits, length} = this;\n return {\n next(){\n if (i < length) {\n const v = {\n done: false,\n value: (bits[i >> 3] & (1 << (i & 7))) ? true : false\n };\n i++;\n return v;\n }\n return {done: true, value: undefined};\n }\n };\n }\n}\n\nclass BitArrayU32 {\n constructor(length) {\n this.bits32 = new Uint32Array(Math.ceil(length / 32));\n this.bits = new Uint8Array(this.bits32.buffer);\n this.length = length;\n }\n\n fill(bool) {\n this.bits32.fill(bool ? 0xFFFFFFFF : 0);\n }\n\n set(i) {\n this.bits[i >> 5] |= (1 << (i & 31));\n }\n\n at(i) {\n return (this.bits32[i >> 5] & (1 << (i & 31))) ? true : false;\n }\n \n forEach(cb) {\n const {bits32, length} = this;\n for(let i = 0; i < length; i++) {\n cb((bits32[i >> 5] & (1 << (i & 31))) ? true : false, i, bits32);\n }\n }\n\n [Symbol.iterator]() {\n let i = 0;\n const {bits32, length} = this;\n return {\n next(){\n if (i < length) {\n const v = {\n done: false,\n value: (bits32[i >> 5] & (1 << (i & 31))) ? true : false\n };\n i++;\n return v;\n }\n return {done: true, value: undefined};\n }\n };\n }\n}\n\nclass BitArrayU32_2 {\n constructor(length) {\n this.bits32 = new Uint32Array(Math.ceil(length / 32));\n this.bits = new Uint8Array(this.bits32.buffer);\n this.length = length;\n }\n\n fill(bool) {\n this.bits32.fill(bool ? 0xFFFFFFFF : 0);\n }\n \n set(i) {\n this.bits[i >> 5] |= (1 << (i & 31));\n }\n\n \n at(i) {\n return (this.bits32[i >> 5] & (1 << (i & 31))) ? true : false;\n }\n \n forEach(cb) {\n const {bits32, length} = this;\n let i = 0, v = 0;\n while(i + 32 < length) {\n v = bits32[i >> 5];\n for (let j = 1; j; j <<= 1) {\n\t cb((v & j) ? true : false, i++, bits32);\n }\n }\n v = bits32[i >> 5];\n for(; i < length; i++) {\n cb((v & (1 << (i & 31))) ? true : false, i, bits32);\n }\n }\n\n *[Symbol.iterator]() {\n const {bits32, length} = this;\n for(let i = 0; i < length; i++) {\n yield (bits32[i >> 5] & (1 << (i & 31))) ? true : false;\n }\n }\n}\n\nconst bitArrU8 = new BitArrayU8(1000000);\nconst bitArrU32 = new BitArrayU32(1000000);\nconst bitArrU32_2 = new BitArrayU32_2(1000000);\n","setup":"// runs before each test\n{\n const {random} = Math;\n for (let i = 0, {bits, length} = bitArrU8; i < length; i++) {\n bits[i] = random() * 256 & 255;\n }\n bitArrU32.bits.set(bitArrU8.bits);\n bitArrU32_2.bits.set(bitArrU8.bits);\n}","tests":[{"name":"[...bitArrU8] custom iterator","code":"const t = [...bitArrU8];","results":{"aborted":false,"count":3,"cycles":2,"hz":27.863777089783284,"stats":{"moe":0.0025030237516321273,"rme":6.974369586591067,"sem":0.0012770529345061874,"deviation":0.007662317607037124,"mean":0.03588888888888889,"variance":0.00005871111111111112,"numSamples":36},"times":{"cycle":0.10766666666666666,"elapsed":6.131,"period":0.03588888888888889,"timeStamp":1680087615381}},"platforms":{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":2,"cycles":2,"hz":16.496018202502842,"stats":{"moe":0.0009100307444448734,"rme":1.5011883725199844,"sem":0.00044435094943597335,"deviation":0.002392903094919407,"mean":0.060620689655172415,"variance":0.0000057259852216748764,"numSamples":29},"times":{"cycle":0.12124137931034483,"elapsed":6.351,"period":0.060620689655172415,"timeStamp":1680087503518}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":27.863777089783284,"stats":{"moe":0.0025030237516321273,"rme":6.974369586591067,"sem":0.0012770529345061874,"deviation":0.007662317607037124,"mean":0.03588888888888889,"variance":0.00005871111111111112,"numSamples":36},"times":{"cycle":0.10766666666666666,"elapsed":6.131,"period":0.03588888888888889,"timeStamp":1680087615381}}}},{"name":"[...bitArrU32] custom iterator","code":"const t = [...bitArrU32];","results":{"aborted":false,"count":3,"cycles":2,"hz":27.81257830117764,"stats":{"moe":0.002437087282279499,"rme":6.778168086520278,"sem":0.0012434118787140302,"deviation":0.007563379185569417,"mean":0.03595495495495497,"variance":0.000057204704704704696,"numSamples":37},"times":{"cycle":0.1078648648648649,"elapsed":6.098,"period":0.03595495495495497,"timeStamp":1680087621518}},"platforms":{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":2,"cycles":2,"hz":16.599885518030906,"stats":{"moe":0.0009823186708613518,"rme":1.6306377478522722,"sem":0.00047964778850651945,"deviation":0.002582982390485202,"mean":0.060241379310344845,"variance":0.000006671798029556649,"numSamples":29},"times":{"cycle":0.12048275862068969,"elapsed":6.327,"period":0.060241379310344845,"timeStamp":1680087509878}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":27.81257830117764,"stats":{"moe":0.002437087282279499,"rme":6.778168086520278,"sem":0.0012434118787140302,"deviation":0.007563379185569417,"mean":0.03595495495495497,"variance":0.000057204704704704696,"numSamples":37},"times":{"cycle":0.1078648648648649,"elapsed":6.098,"period":0.03595495495495497,"timeStamp":1680087621518}}}},{"name":"[...bitArrU32] generator","code":"const t = [...bitArrU32_2];","results":{"aborted":false,"count":1,"cycles":1,"hz":5.783866057838661,"stats":{"moe":0.002614957663230187,"rme":1.5124564871042179,"sem":0.0012446252561780996,"deviation":0.00542519571425876,"mean":0.17289473684210527,"variance":0.000029432748538011616,"numSamples":19},"times":{"cycle":0.17289473684210527,"elapsed":6.883,"period":0.17289473684210527,"timeStamp":1680087627622}},"platforms":{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":2,"cycles":2,"hz":14.281790716836035,"stats":{"moe":0.000946567317410933,"rme":1.351867632665985,"sem":0.00045949869777229754,"deviation":0.0023429928264114184,"mean":0.07001923076923076,"variance":0.000005489615384615366,"numSamples":26},"times":{"cycle":0.14003846153846153,"elapsed":6.517,"period":0.07001923076923076,"timeStamp":1680087516214}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":1,"cycles":1,"hz":5.783866057838661,"stats":{"moe":0.002614957663230187,"rme":1.5124564871042179,"sem":0.0012446252561780996,"deviation":0.00542519571425876,"mean":0.17289473684210527,"variance":0.000029432748538011616,"numSamples":19},"times":{"cycle":0.17289473684210527,"elapsed":6.883,"period":0.17289473684210527,"timeStamp":1680087627622}}}},{"name":"bitArrU8.forEach","code":"let t = [false];\nbitArrU8.forEach((v, i) => t[i] = v);","results":{"aborted":false,"count":4,"cycles":2,"hz":38.98635477582846,"stats":{"moe":0.0003276702532604918,"rme":1.2774668743099096,"sem":0.00016717870064310807,"deviation":0.0010573309405993556,"mean":0.02565,"variance":0.000001117948717948718,"numSamples":40},"times":{"cycle":0.1026,"elapsed":5.96,"period":0.02565,"timeStamp":1680087634510}},"platforms":{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":30.477759472817148,"stats":{"moe":0.0012947276714300156,"rme":3.9460398552644644,"sem":0.0006605753425663345,"deviation":0.00401812294220141,"mean":0.032810810810810796,"variance":0.000016145311978645312,"numSamples":37},"times":{"cycle":0.09843243243243238,"elapsed":6.191,"period":0.032810810810810796,"timeStamp":1680087522742}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":2,"hz":38.98635477582846,"stats":{"moe":0.0003276702532604918,"rme":1.2774668743099096,"sem":0.00016717870064310807,"deviation":0.0010573309405993556,"mean":0.02565,"variance":0.000001117948717948718,"numSamples":40},"times":{"cycle":0.1026,"elapsed":5.96,"period":0.02565,"timeStamp":1680087634510}}}},{"name":"bitArrU32.forEach","code":"let t = [false];\nbitArrU32.forEach((v, i) => t[i] = v);","results":{"aborted":false,"count":3,"cycles":2,"hz":34.764287595470115,"stats":{"moe":0.0003982915095675928,"rme":1.3846320585441734,"sem":0.00020320995386101674,"deviation":0.0013479423412448503,"mean":0.028765151515151507,"variance":0.0000018169485553206483,"numSamples":44},"times":{"cycle":0.08629545454545452,"elapsed":5.906,"period":0.028765151515151507,"timeStamp":1680087640474}},"platforms":{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":33.39041095890412,"stats":{"moe":0.0004657258934868994,"rme":1.5550778977730377,"sem":0.0002376152517790303,"deviation":0.0014839067717489756,"mean":0.02994871794871794,"variance":0.0000022019793072424664,"numSamples":39},"times":{"cycle":0.08984615384615383,"elapsed":6.221,"period":0.02994871794871794,"timeStamp":1680087528942}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":34.764287595470115,"stats":{"moe":0.0003982915095675928,"rme":1.3846320585441734,"sem":0.00020320995386101674,"deviation":0.0013479423412448503,"mean":0.028765151515151507,"variance":0.0000018169485553206483,"numSamples":44},"times":{"cycle":0.08629545454545452,"elapsed":5.906,"period":0.028765151515151507,"timeStamp":1680087640474}}}},{"name":"bitArrU32.forEach \"unrolled\"","code":"let t = [false];\nbitArrU32_2.forEach((v, i) => t[i] = v);","results":{"aborted":false,"count":4,"cycles":2,"hz":40.265160815123984,"stats":{"moe":0.000394163830057553,"rme":1.5871070004772572,"sem":0.00020110399492732298,"deviation":0.0012876938641637145,"mean":0.024835365853658538,"variance":0.0000016581554878048787,"numSamples":41},"times":{"cycle":0.09934146341463415,"elapsed":5.833,"period":0.024835365853658538,"timeStamp":1680087646386}},"platforms":{"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":33.92287619599884,"stats":{"moe":0.0008124172753473595,"rme":2.7559530651099178,"sem":0.00041449860987110177,"deviation":0.002588542988983949,"mean":0.02947863247863248,"variance":0.000006700554805817957,"numSamples":39},"times":{"cycle":0.08843589743589744,"elapsed":6.091,"period":0.02947863247863248,"timeStamp":1680087535174}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":2,"hz":40.265160815123984,"stats":{"moe":0.000394163830057553,"rme":1.5871070004772572,"sem":0.00020110399492732298,"deviation":0.0012876938641637145,"mean":0.024835365853658538,"variance":0.0000016581554878048787,"numSamples":41},"times":{"cycle":0.09934146341463415,"elapsed":5.833,"period":0.024835365853658538,"timeStamp":1680087646386}}}},{"name":"for-loop bitArrU8.at(i)","code":"const t = [false];\nfor (let i = 0; i < bitArrU8.length; i++) t[i] = bitArrU8.at(i);\n","results":{"aborted":false,"count":4,"cycles":3,"hz":46.94132334581771,"stats":{"moe":0.0003446943899306492,"rme":1.6180410813223978,"sem":0.00017586448465849449,"deviation":0.0012056661632961665,"mean":0.02130319148936171,"variance":0.0000014536308973172986,"numSamples":47},"times":{"cycle":0.08521276595744684,"elapsed":6.018,"period":0.02130319148936171,"timeStamp":1680087652225}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":3,"hz":46.94132334581771,"stats":{"moe":0.0003446943899306492,"rme":1.6180410813223978,"sem":0.00017586448465849449,"deviation":0.0012056661632961665,"mean":0.02130319148936171,"variance":0.0000014536308973172986,"numSamples":47},"times":{"cycle":0.08521276595744684,"elapsed":6.018,"period":0.02130319148936171,"timeStamp":1680087652225}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":30.751708428246,"stats":{"moe":0.0005349945322336391,"rme":1.645199586595473,"sem":0.00027295639399675464,"deviation":0.0016377383639805277,"mean":0.03251851851851853,"variance":0.0000026821869488536152,"numSamples":36},"times":{"cycle":0.09755555555555559,"elapsed":6.171,"period":0.03251851851851853,"timeStamp":1680087541276}}}},{"name":"for-loop bitArrU32.at(i)","code":"const t = [false];\nfor (let i = 0; i < bitArrU32.length; i++) t[i] = bitArrU32.at(i);","results":{"aborted":false,"count":4,"cycles":2,"hz":42.553191489361694,"stats":{"moe":0.0003771630124819985,"rme":1.6049489892850999,"sem":0.0001924301084091829,"deviation":0.0012618486061179862,"mean":0.023500000000000004,"variance":0.0000015922619047619047,"numSamples":43},"times":{"cycle":0.09400000000000001,"elapsed":5.972,"period":0.023500000000000004,"timeStamp":1680087658248}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":2,"hz":42.553191489361694,"stats":{"moe":0.0003771630124819985,"rme":1.6049489892850999,"sem":0.0001924301084091829,"deviation":0.0012618486061179862,"mean":0.023500000000000004,"variance":0.0000015922619047619047,"numSamples":43},"times":{"cycle":0.09400000000000001,"elapsed":5.972,"period":0.023500000000000004,"timeStamp":1680087658248}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":30.97218239174076,"stats":{"moe":0.0005619901194646197,"rme":1.7406060482414376,"sem":0.00028672965278807126,"deviation":0.0017203779167284275,"mean":0.03228703703703703,"variance":0.000002959700176366844,"numSamples":36},"times":{"cycle":0.09686111111111109,"elapsed":6.135,"period":0.03228703703703703,"timeStamp":1680087547462}}}},{"name":"for-loop bitArrU8 inlined","code":"const t = [false], {bits, length} = bitArrU8;\nfor (let i = 0; i < length; i++) t[i] = (bits[i >> 3] & (1 << (i & 7))) ? true : false;","results":{"aborted":false,"count":6,"cycles":2,"hz":63.661227954352555,"stats":{"moe":0.0002766031519772525,"rme":1.7608896310916295,"sem":0.00014112405713125127,"deviation":0.0009466889550181255,"mean":0.015708148148148145,"variance":8.962199775533104e-7,"numSamples":45},"times":{"cycle":0.09424888888888887,"elapsed":5.758,"period":0.015708148148148145,"timeStamp":1680087664227}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":6,"cycles":2,"hz":63.661227954352555,"stats":{"moe":0.0002766031519772525,"rme":1.7608896310916295,"sem":0.00014112405713125127,"deviation":0.0009466889550181255,"mean":0.015708148148148145,"variance":8.962199775533104e-7,"numSamples":45},"times":{"cycle":0.09424888888888887,"elapsed":5.758,"period":0.015708148148148145,"timeStamp":1680087664227}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":30.243629235508266,"stats":{"moe":0.0005865691323712443,"rme":1.7739979360429683,"sem":0.0002992699654955328,"deviation":0.001795619792973197,"mean":0.03306481481481481,"variance":0.0000032242504409171063,"numSamples":36},"times":{"cycle":0.09919444444444443,"elapsed":6.265,"period":0.03306481481481481,"timeStamp":1680087553608}}}},{"name":"for-loop bitArrU32 inlined","code":"const t = [false], {bits32, length} = bitArrU32;\nfor (let i = 0; i < length; i++) t[i] = (bits32[i >> 5] & (1 << (i & 31))) ? true : false;","results":{"aborted":false,"count":5,"cycles":2,"hz":55.508627971521676,"stats":{"moe":0.0002820947374088465,"rme":1.5658691831551756,"sem":0.00014392588643308494,"deviation":0.0009761528549029942,"mean":0.018015217391304343,"variance":9.52874396135266e-7,"numSamples":46},"times":{"cycle":0.09007608695652172,"elapsed":5.966,"period":0.018015217391304343,"timeStamp":1680087669991}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":5,"cycles":2,"hz":55.508627971521676,"stats":{"moe":0.0002820947374088465,"rme":1.5658691831551756,"sem":0.00014392588643308494,"deviation":0.0009761528549029942,"mean":0.018015217391304343,"variance":9.52874396135266e-7,"numSamples":46},"times":{"cycle":0.09007608695652172,"elapsed":5.966,"period":0.018015217391304343,"timeStamp":1680087669991}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":30.560271646859082,"stats":{"moe":0.0005989595917861177,"rme":1.8304367830475583,"sem":0.00030559162846230495,"deviation":0.0018335497707738298,"mean":0.03272222222222222,"variance":0.000003361904761904764,"numSamples":36},"times":{"cycle":0.09816666666666667,"elapsed":6.207,"period":0.03272222222222222,"timeStamp":1680087559883}}}},{"name":"for-loop bitArrU32 inlined \"unrolled\"","code":"const t = [false], {bits32, length} = bitArrU32;\nlet i = 0, v = 0;\nwhile(i + 32 < length) {\n v = bits32[i >> 5];\n for (let j = 1; j; j <<= 1, i++) t[i] = (v & j) ? true : false;\n}\nv = bits32[i >> 5];\nfor(; i < length; i++) t[i] = (v & (1 << (i & 31))) ? true : false;","results":{"aborted":false,"count":6,"cycles":2,"hz":67.48994830557153,"stats":{"moe":0.00028051264023766547,"rme":1.8931783588699427,"sem":0.0001431186939988089,"deviation":0.0009811723329163236,"mean":0.01481702127659574,"variance":9.62699146880461e-7,"numSamples":47},"times":{"cycle":0.08890212765957445,"elapsed":5.85,"period":0.01481702127659574,"timeStamp":1680087675963}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":6,"cycles":2,"hz":67.48994830557153,"stats":{"moe":0.00028051264023766547,"rme":1.8931783588699427,"sem":0.0001431186939988089,"deviation":0.0009811723329163236,"mean":0.01481702127659574,"variance":9.62699146880461e-7,"numSamples":47},"times":{"cycle":0.08890212765957445,"elapsed":5.85,"period":0.01481702127659574,"timeStamp":1680087675963}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":3,"cycles":2,"hz":30.664395229982965,"stats":{"moe":0.000572351441720475,"rme":1.7550810819367206,"sem":0.0002920160416941199,"deviation":0.0017520962501647195,"mean":0.03261111111111111,"variance":0.0000030698412698412718,"numSamples":36},"times":{"cycle":0.09783333333333333,"elapsed":6.131,"period":0.03261111111111111,"timeStamp":1680087566100}}}}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment