免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: gongyonghui2
打印 上一主题 下一主题

perl 如何高效统计01字符串(二进制串)中1的个数? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2013-04-11 15:09 |只看该作者
统计一个字节内的值为1的2进制位数的代码:
perl -E 'say unpack("%b8",pack("C",255))'

论坛徽章:
0
22 [报告]
发表于 2013-04-11 15:33 |只看该作者
针对楼主的问题,效率最高的做法是:
perl -E 'say unpack("%B14",pack("B14","01010101011101"))'

论坛徽章:
1
午马
日期:2013-11-25 16:01:44
23 [报告]
发表于 2013-04-11 23:19 |只看该作者
总结了下大家的建议,pack效率虽然不错,但是还是没能超过tr,测试代码及结果如下:
use 5.014;

use Benchmark qw(timethese);

timethese(-2, {
    'tr' => sub {
      my $str = "10101010101010"x10;
      my $times = $str=~ tr/1/0/;
      return $times;
    },
    'replace' => sub {
      my $str = "10101010101010"x10;
      my $times = $str =~ s/1/0/g;
      return $times;
    },
    'while'=>sub{
            my $str = "10101010101010"x10;
      my $times =0;
      $times++ while $str =~/1/g;
      return $times;           
    },
   
    'chop'=>sub{
            my $str = "10101010101010"x10;
      my $times =0;
      while($str)
                        {
                    $times++ if chop $str;
                        }
      return $times;           
    },
     'pack'=>sub{
            my $str = "10101010101010"x10;
      return unpack("%B*",pack("B*",$str));           
    },   
   
   
  }
);

##结果
Benchmark: running chop, pack, replace, tr, while for at least 2 CPU seconds...
      chop:  2 wallclock secs ( 2.12 usr +  0.00 sys =  2.12 CPU) @ 66080.15/s (n=140156)
      pack:  3 wallclock secs ( 2.09 usr +  0.00 sys =  2.09 CPU) @ 757637.32/s (n=1583462)
   replace:  2 wallclock secs ( 2.15 usr +  0.00 sys =  2.15 CPU) @ 34983.74/s (n=75320)
        tr:  2 wallclock secs ( 2.17 usr +  0.00 sys =  2.17 CPU) @ 1224101.01/s (n=2653851)
     while:  2 wallclock secs ( 2.17 usr +  0.00 sys =  2.17 CPU) @ 86977.40/s (n=188567)

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP