in reply to An array of boolean values in a bitfield
I tried the following, which gave some performance improvements... benchmark output below.
my @bits_in = map $bits_in{chr($_ & 0xFF)} + $bits_in{chr($_ >> 8)}, ( +0..65535) ; # Use vec() and @bits_in -- faster than ord(substr(..)) sub loop_count_va { # "lpva" my ( $bits ) = @_; my $count; $count += $bits_in[vec($bits, $_, 8)] for 0 .. length( $bits ) - 1 +; return $count; } # As "lpva" but 16 bits at a time sub loop_count_VA { # "lpVA" my ( $bits ) = @_; my $count; $count += $bits_in[vec($bits, $_, 16)] for 0 .. (length( $bits ) - + 1) >> 1 ; return $count; } # The other other scheme sub unpack_count { # "unpk" my ( $bits ) = @_ ; my $count = unpack("%32b*", $bits); if ($count != $COUNT) { die "unpack_count $count != $COUNT" ; } ; return $count; }
8, 1
Rate vec re loop lpVA lpva unpk chop
vec 149293/s -- -37% -46% -48% -49% -75% -75%
re 238312/s 60% -- -14% -17% -18% -60% -60%
loop 277974/s 86% 17% -- -3% -5% -53% -54%
lpVA 286959/s 92% 20% 3% -- -2% -51% -52%
lpva 292322/s 96% 23% 5% 2% -- -51% -51%
unpk 591644/s 296% 148% 113% 106% 102% -- -2%
chop 601741/s 303% 153% 116% 110% 106% 2% --
8, 8
Rate vec re loop lpVA lpva chop unpk
vec 152240/s -- -36% -46% -46% -49% -73% -74%
re 236307/s 55% -- -16% -17% -20% -58% -60%
loop 281098/s 85% 19% -- -1% -5% -50% -53%
lpVA 283269/s 86% 20% 1% -- -4% -50% -52%
lpva 295821/s 94% 25% 5% 4% -- -47% -50%
chop 562195/s 269% 138% 100% 98% 90% -- -6%
unpk 595781/s 291% 152% 112% 110% 101% 6% --
1000, 1
Rate vec loop lpva chop lpVA re unpk
vec 2619/s -- -83% -86% -86% -92% -98% -99%
loop 15605/s 496% -- -14% -19% -54% -87% -96%
lpva 18101/s 591% 16% -- -6% -47% -85% -96%
chop 19199/s 633% 23% 6% -- -44% -84% -95%
lpVA 34132/s 1203% 119% 89% 78% -- -72% -92%
re 121406/s 4535% 678% 571% 532% 256% -- -71%
unpk 421646/s 15997% 2602% 2229% 2096% 1135% 247% --
1000, 10
Rate vec loop lpva chop lpVA re unpk
vec 2619/s -- -83% -86% -86% -92% -95% -99%
loop 15753/s 501% -- -13% -17% -53% -69% -96%
lpva 18101/s 591% 15% -- -5% -46% -65% -96%
chop 19029/s 626% 21% 5% -- -44% -63% -96%
lpVA 33810/s 1191% 115% 87% 78% -- -34% -92%
re 51200/s 1855% 225% 183% 169% 51% -- -88%
unpk 424769/s 16116% 2596% 2247% 2132% 1156% 730% --
1000, 100
Rate vec re loop lpva chop lpVA unpk
vec 2619/s -- -72% -83% -85% -86% -92% -99%
re 9481/s 262% -- -39% -47% -50% -72% -98%
loop 15459/s 490% 63% -- -14% -18% -54% -96%
lpva 17935/s 585% 89% 16% -- -5% -46% -96%
chop 18797/s 618% 98% 22% 5% -- -44% -96%
lpVA 33494/s 1179% 253% 117% 87% 78% -- -92%
unpk 421646/s 15997% 4347% 2628% 2251% 2143% 1159% --
1000, 500
Rate vec re loop lpva chop lpVA unpk
vec 2595/s -- -53% -83% -86% -86% -92% -99%
re 5480/s 111% -- -64% -70% -71% -83% -99%
loop 15316/s 490% 179% -- -15% -18% -54% -96%
lpva 18101/s 597% 230% 18% -- -3% -45% -96%
chop 18618/s 617% 240% 22% 3% -- -44% -96%
lpVA 33184/s 1179% 506% 117% 83% 78% -- -92%
unpk 421647/s 16146% 7595% 2653% 2229% 2165% 1171% --
1000, 900
Rate vec re loop lpva chop lpVA unpk
vec 2619/s -- -52% -83% -85% -86% -92% -99%
re 5430/s 107% -- -65% -70% -71% -84% -99%
loop 15459/s 490% 185% -- -14% -17% -53% -96%
lpva 17935/s 585% 230% 16% -- -4% -46% -96%
chop 18698/s 614% 244% 21% 4% -- -44% -96%
lpVA 33185/s 1167% 511% 115% 85% 77% -- -92%
unpk 417553/s 15841% 7590% 2601% 2228% 2133% 1158% --
1000000, 1
(warning: too few iterations for a reliable count)
Rate vec loop lpva chop lpVA re unpk
vec 2.65/s -- -84% -86% -87% -93% -99% -100%
loop 16.8/s 533% -- -13% -15% -56% -93% -99%
lpva 19.2/s 624% 14% -- -3% -50% -93% -99%
chop 19.8/s 646% 18% 3% -- -49% -92% -99%
lpVA 38.5/s 1349% 129% 100% 94% -- -85% -97%
re 258/s 9631% 1436% 1243% 1205% 572% -- -81%
unpk 1370/s 51493% 8046% 7023% 6817% 3461% 430% --
1000000, 100
(warning: too few iterations for a reliable count)
Rate vec loop lpva chop lpVA re unpk
vec 2.65/s -- -84% -86% -87% -93% -99% -100%
loop 16.7/s 528% -- -12% -16% -57% -93% -99%
lpva 19.0/s 617% 14% -- -4% -50% -92% -99%
chop 19.8/s 646% 19% 4% -- -48% -92% -99%
lpVA 38.3/s 1343% 130% 101% 94% -- -85% -97%
re 250/s 9317% 1400% 1213% 1163% 552% -- -83%
unpk 1437/s 54037% 8524% 7446% 7158% 3651% 475% --
1000000, 100000
(warning: too few iterations for a reliable count)
Rate vec re loop lpva chop lpVA unpk
vec 2.68/s -- -72% -84% -86% -86% -93% -100%
re 9.71/s 262% -- -41% -49% -50% -73% -99%
loop 16.5/s 516% 70% -- -13% -15% -55% -99%
lpva 19.0/s 609% 96% 15% -- -2% -48% -99%
chop 19.4/s 625% 100% 18% 2% -- -47% -99%
lpVA 36.4/s 1261% 275% 121% 92% 88% -- -97%
unpk 1422/s 52984% 14546% 8515% 7384% 7223% 3801% --
1000000, 500000
(warning: too few iterations for a reliable count)
Rate vec re loop lpva chop lpVA unpk
vec 2.68/s -- -52% -82% -86% -86% -91% -100%
re 5.56/s 107% -- -62% -71% -71% -81% -100%
loop 14.5/s 443% 162% -- -24% -25% -51% -99%
lpva 19.0/s 611% 243% 31% -- -2% -36% -99%
chop 19.4/s 626% 250% 34% 2% -- -35% -99%
lpVA 29.9/s 1017% 438% 106% 57% 54% -- -98%
unpk 1370/s 51036% 24555% 9317% 7091% 6944% 4480% --
1000000, 900000
(warning: too few iterations for a reliable count)
Rate vec re loop lpva chop lpVA unpk
vec 2.68/s -- -51% -84% -86% -86% -91% -100%
re 5.50/s 106% -- -67% -71% -72% -81% -100%
loop 16.5/s 516% 200% -- -13% -16% -44% -99%
lpva 18.9/s 606% 244% 15% -- -4% -36% -99%
chop 19.6/s 633% 257% 19% 4% -- -34% -99%
lpVA 29.6/s 1006% 438% 80% 57% 51% -- -98%
unpk 1436/s 53495% 25980% 8598% 7488% 7215% 4745% --
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: An array of boolean values in a bitfield
by kyle (Abbot) on Dec 03, 2008 at 19:32 UTC |