Skip to content

Instantly share code, notes, and snippets.

@JobLeonard
Last active March 29, 2023 10: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 JobLeonard/e9a69d3b02a4be29527ff85fb7e19ac5 to your computer and use it in GitHub Desktop.
Save JobLeonard/e9a69d3b02a4be29527ff85fb7e19ac5 to your computer and use it in GitHub Desktop.
Bit Array iterator test (random bits initialized once)
{"title":"Bit Array iterator test (random bits initialized once)","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{\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}","setup":"// runs before each test\n","tests":[{"name":"[...bitArrU8] custom iterator","code":"const t = [...bitArrU8];","results":{"aborted":false,"count":3,"cycles":2,"hz":25.405274618920885,"stats":{"moe":0.0022738655693446304,"rme":5.776817923570922,"sem":0.001160135494563587,"deviation":0.0068634541450439115,"mean":0.03936190476190476,"variance":0.00004710700280112045,"numSamples":35},"times":{"cycle":0.11808571428571427,"elapsed":6.007,"period":0.03936190476190476,"timeStamp":1680087357025}},"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":15.225933202357563,"stats":{"moe":0.0010050090795005783,"rme":1.5302201112238667,"sem":0.0004921689909405379,"deviation":0.002740280968248739,"mean":0.06567741935483871,"variance":0.000007509139784946245,"numSamples":31},"times":{"cycle":0.13135483870967743,"elapsed":6.421,"period":0.06567741935483871,"timeStamp":1680087197894}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":25.405274618920885,"stats":{"moe":0.0022738655693446304,"rme":5.776817923570922,"sem":0.001160135494563587,"deviation":0.0068634541450439115,"mean":0.03936190476190476,"variance":0.00004710700280112045,"numSamples":35},"times":{"cycle":0.11808571428571427,"elapsed":6.007,"period":0.03936190476190476,"timeStamp":1680087357025}}}},{"name":"[...bitArrU32] custom iterator","code":"const t = [...bitArrU32];","results":{"aborted":false,"count":3,"cycles":2,"hz":23.160762942779293,"stats":{"moe":0.002272311376344369,"rme":5.262846511969247,"sem":0.0011593425389512086,"deviation":0.006760070574272312,"mean":0.04317647058823529,"variance":0.00004569855416914239,"numSamples":34},"times":{"cycle":0.12952941176470587,"elapsed":6.372,"period":0.04317647058823529,"timeStamp":1680087363037}},"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.847809948032664,"stats":{"moe":0.0009720706447383696,"rme":1.443312018913689,"sem":0.00047534016857621986,"deviation":0.0026035453281750393,"mean":0.06735000000000001,"variance":0.000006778448275862074,"numSamples":30},"times":{"cycle":0.13470000000000001,"elapsed":6.289,"period":0.06735000000000001,"timeStamp":1680087204326}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":23.160762942779293,"stats":{"moe":0.002272311376344369,"rme":5.262846511969247,"sem":0.0011593425389512086,"deviation":0.006760070574272312,"mean":0.04317647058823529,"variance":0.00004569855416914239,"numSamples":34},"times":{"cycle":0.12952941176470587,"elapsed":6.372,"period":0.04317647058823529,"timeStamp":1680087363037}}}},{"name":"[...bitArrU32] generator","code":"const t = [...bitArrU32_2];","results":{"aborted":false,"count":1,"cycles":1,"hz":5.550416281221091,"stats":{"moe":0.006958986960025427,"rme":3.86252745237304,"sem":0.0032980980853201075,"deviation":0.0139926451268893,"mean":0.18016666666666667,"variance":0.00019579411764705887,"numSamples":18},"times":{"cycle":0.18016666666666667,"elapsed":6.686,"period":0.18016666666666667,"timeStamp":1680087369420}},"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":13.16431009263774,"stats":{"moe":0.0011982985179775504,"rme":1.5774773274204714,"sem":0.0005828300184715712,"deviation":0.0030284736125072054,"mean":0.07596296296296295,"variance":0.000009171652421652443,"numSamples":27},"times":{"cycle":0.1519259259259259,"elapsed":5.985,"period":0.07596296296296295,"timeStamp":1680087210622}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":1,"cycles":1,"hz":5.550416281221091,"stats":{"moe":0.006958986960025427,"rme":3.86252745237304,"sem":0.0032980980853201075,"deviation":0.0139926451268893,"mean":0.18016666666666667,"variance":0.00019579411764705887,"numSamples":18},"times":{"cycle":0.18016666666666667,"elapsed":6.686,"period":0.18016666666666667,"timeStamp":1680087369420}}}},{"name":"bitArrU8.forEach","code":"let t = [false];\nbitArrU8.forEach((v, i) => t[i] = v);","results":{"aborted":false,"count":3,"cycles":2,"hz":37.675449396700316,"stats":{"moe":0.0006093093163999855,"rme":2.2956002316965716,"sem":0.0003108721002040742,"deviation":0.002220070854038197,"mean":0.026542483660130723,"variance":0.000004928714596949891,"numSamples":51},"times":{"cycle":0.07962745098039217,"elapsed":5.899,"period":0.026542483660130723,"timeStamp":1680087376111}},"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":31.03572717430531,"stats":{"moe":0.0009046114567631064,"rme":2.807527437085066,"sem":0.00046153645753219715,"deviation":0.003026496946991504,"mean":0.032220930232558134,"variance":0.000009159683770148893,"numSamples":43},"times":{"cycle":0.0966627906976744,"elapsed":6.109,"period":0.032220930232558134,"timeStamp":1680087216614}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":37.675449396700316,"stats":{"moe":0.0006093093163999855,"rme":2.2956002316965716,"sem":0.0003108721002040742,"deviation":0.002220070854038197,"mean":0.026542483660130723,"variance":0.000004928714596949891,"numSamples":51},"times":{"cycle":0.07962745098039217,"elapsed":5.899,"period":0.026542483660130723,"timeStamp":1680087376111}}}},{"name":"bitArrU32.forEach","code":"let t = [false];\nbitArrU32.forEach((v, i) => t[i] = v);","results":{"aborted":false,"count":3,"cycles":2,"hz":34.33999025815881,"stats":{"moe":0.00033630074840989015,"rme":1.1548564424207144,"sem":0.00017158201449484192,"deviation":0.0011763070270176415,"mean":0.029120567375886513,"variance":0.0000013836982218110823,"numSamples":47},"times":{"cycle":0.08736170212765954,"elapsed":5.918,"period":0.029120567375886513,"timeStamp":1680087382016}},"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":32.19512195121951,"stats":{"moe":0.0007498869470107009,"rme":2.41427017086372,"sem":0.00038259538112790864,"deviation":0.0025378506514485886,"mean":0.031060606060606063,"variance":0.000006440685929058025,"numSamples":44},"times":{"cycle":0.09318181818181819,"elapsed":6.067,"period":0.031060606060606063,"timeStamp":1680087222734}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":3,"cycles":2,"hz":34.33999025815881,"stats":{"moe":0.00033630074840989015,"rme":1.1548564424207144,"sem":0.00017158201449484192,"deviation":0.0011763070270176415,"mean":0.029120567375886513,"variance":0.0000013836982218110823,"numSamples":47},"times":{"cycle":0.08736170212765954,"elapsed":5.918,"period":0.029120567375886513,"timeStamp":1680087382016}}}},{"name":"bitArrU32.forEach \"unrolled\"","code":"let t = [false];\nbitArrU32_2.forEach((v, i) => t[i] = v);","results":{"aborted":false,"count":4,"cycles":2,"hz":39.96366939146229,"stats":{"moe":0.0003337281328474625,"rme":1.3337000767746,"sem":0.00017026945553441964,"deviation":0.0011294397945315453,"mean":0.025022727272727283,"variance":0.000001275634249471459,"numSamples":44},"times":{"cycle":0.10009090909090913,"elapsed":5.898,"period":0.025022727272727283,"timeStamp":1680087387939}},"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":32.33532934131736,"stats":{"moe":0.0008865379235889135,"rme":2.8666495732815167,"sem":0.00045231526713720077,"deviation":0.003034223053739273,"mean":0.03092592592592593,"variance":0.000009206509539842878,"numSamples":45},"times":{"cycle":0.09277777777777779,"elapsed":6.089,"period":0.03092592592592593,"timeStamp":1680087228814}},"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":2,"hz":39.96366939146229,"stats":{"moe":0.0003337281328474625,"rme":1.3337000767746,"sem":0.00017026945553441964,"deviation":0.0011294397945315453,"mean":0.025022727272727283,"variance":0.000001275634249471459,"numSamples":44},"times":{"cycle":0.10009090909090913,"elapsed":5.898,"period":0.025022727272727283,"timeStamp":1680087387939}}}},{"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":2,"hz":45.24469067405356,"stats":{"moe":0.0003639883239885587,"rme":1.6468539127829525,"sem":0.00018570832856559116,"deviation":0.0012999582999591382,"mean":0.02210204081632653,"variance":0.0000016898915816326527,"numSamples":49},"times":{"cycle":0.08840816326530612,"elapsed":5.834,"period":0.02210204081632653,"timeStamp":1680087393842}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":2,"hz":45.24469067405356,"stats":{"moe":0.0003639883239885587,"rme":1.6468539127829525,"sem":0.00018570832856559116,"deviation":0.0012999582999591382,"mean":0.02210204081632653,"variance":0.0000016898915816326527,"numSamples":49},"times":{"cycle":0.08840816326530612,"elapsed":5.834,"period":0.02210204081632653,"timeStamp":1680087393842}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":4,"cycles":2,"hz":41.707593502077806,"stats":{"moe":0.000985019482696888,"rme":4.108279217594878,"sem":0.0005025609605596368,"deviation":0.00340853427115186,"mean":0.023976449275362327,"variance":0.000011618105877616742,"numSamples":46},"times":{"cycle":0.09590579710144931,"elapsed":6.157,"period":0.023976449275362327,"timeStamp":1680087234910}}}},{"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":40.739343643907944,"stats":{"moe":0.0003760056457907805,"rme":1.5318223215920135,"sem":0.0001918396151993778,"deviation":0.001286899261089632,"mean":0.024546296296296306,"variance":0.0000016561097081930411,"numSamples":45},"times":{"cycle":0.09818518518518522,"elapsed":5.991,"period":0.024546296296296306,"timeStamp":1680087399681}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":4,"cycles":2,"hz":40.739343643907944,"stats":{"moe":0.0003760056457907805,"rme":1.5318223215920135,"sem":0.0001918396151993778,"deviation":0.001286899261089632,"mean":0.024546296296296306,"variance":0.0000016561097081930411,"numSamples":45},"times":{"cycle":0.09818518518518522,"elapsed":5.991,"period":0.024546296296296306,"timeStamp":1680087399681}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":4,"cycles":2,"hz":41.72335600907027,"stats":{"moe":0.0008826847210302107,"rme":3.6828568859310358,"sem":0.0004503493474643932,"deviation":0.0030544178821886535,"mean":0.02396739130434784,"variance":0.000009329468599033818,"numSamples":46},"times":{"cycle":0.09586956521739136,"elapsed":6.042,"period":0.02396739130434784,"timeStamp":1680087241078}}}},{"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":5,"cycles":2,"hz":61.521252796420605,"stats":{"moe":0.00030744420453830863,"rme":1.8914352628195727,"sem":0.0001568592880297493,"deviation":0.0011632996145731296,"mean":0.01625454545454545,"variance":0.000001353265993265992,"numSamples":55},"times":{"cycle":0.08127272727272725,"elapsed":5.827,"period":0.01625454545454545,"timeStamp":1680087405677}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":5,"cycles":2,"hz":61.521252796420605,"stats":{"moe":0.00030744420453830863,"rme":1.8914352628195727,"sem":0.0001568592880297493,"deviation":0.0011632996145731296,"mean":0.01625454545454545,"variance":0.000001353265993265992,"numSamples":55},"times":{"cycle":0.08127272727272725,"elapsed":5.827,"period":0.01625454545454545,"timeStamp":1680087405677}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":4,"cycles":2,"hz":42.562825447136056,"stats":{"moe":0.0010056697713168577,"rme":4.280414693402065,"sem":0.0005130968221004376,"deviation":0.003517614588884021,"mean":0.023494680851063834,"variance":0.000012373612395929699,"numSamples":47},"times":{"cycle":0.09397872340425534,"elapsed":6.002,"period":0.023494680851063834,"timeStamp":1680087247126}}}},{"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":53.41345351360374,"stats":{"moe":0.00036589101827758195,"rme":1.954350289581476,"sem":0.00018667909095794997,"deviation":0.0012933506809997646,"mean":0.018721875,"variance":0.0000016727559840425548,"numSamples":48},"times":{"cycle":0.093609375,"elapsed":5.863,"period":0.018721875,"timeStamp":1680087411510}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":5,"cycles":2,"hz":53.41345351360374,"stats":{"moe":0.00036589101827758195,"rme":1.954350289581476,"sem":0.00018667909095794997,"deviation":0.0012933506809997646,"mean":0.018721875,"variance":0.0000016727559840425548,"numSamples":48},"times":{"cycle":0.093609375,"elapsed":5.863,"period":0.018721875,"timeStamp":1680087411510}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":4,"cycles":2,"hz":43.2581684307409,"stats":{"moe":0.0009165062772154536,"rme":3.96463829076174,"sem":0.00046760524347727226,"deviation":0.003205740038616612,"mean":0.02311702127659575,"variance":0.000010276769195189637,"numSamples":47},"times":{"cycle":0.092468085106383,"elapsed":5.961,"period":0.02311702127659575,"timeStamp":1680087253134}}}},{"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":55.97014925373134,"stats":{"moe":0.0010477043396824556,"rme":5.864016826580908,"sem":0.0005345430304502325,"deviation":0.0035858236589563796,"mean":0.017866666666666666,"variance":0.000012858131313131319,"numSamples":45},"times":{"cycle":0.10719999999999999,"elapsed":5.998,"period":0.017866666666666666,"timeStamp":1680087417378}},"platforms":{"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0":{"aborted":false,"count":6,"cycles":2,"hz":55.97014925373134,"stats":{"moe":0.0010477043396824556,"rme":5.864016826580908,"sem":0.0005345430304502325,"deviation":0.0035858236589563796,"mean":0.017866666666666666,"variance":0.000012858131313131319,"numSamples":45},"times":{"cycle":0.10719999999999999,"elapsed":5.998,"period":0.017866666666666666,"timeStamp":1680087417378}},"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36":{"aborted":false,"count":4,"cycles":2,"hz":43.75569735642663,"stats":{"moe":0.0009444777363413308,"rme":4.132628199123417,"sem":0.0004818763960925157,"deviation":0.003338537604001688,"mean":0.02285416666666666,"variance":0.000011145833333333333,"numSamples":48},"times":{"cycle":0.09141666666666665,"elapsed":6.022,"period":0.02285416666666666,"timeStamp":1680087259102}}}}]}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment