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

    Thank you! That's a pretty big win for unpack. It's too bad every time I learn how to use it I forget it by the time I need it again.