Perl中字符串最快的校验位例程是什么?
|
给定一串数字,我必须使用Perl尽可能快地求和所有数字。
我的第一个实现使用unpack()对数字进行解包,然后用List :: Utils \'sum()对数字列表求和。
它的速度非常快,但是此任务有更快的打包/解包配方吗?
我尝试使用打包/解包组合,并对这两种实现进行了基准测试。
使用的CPU时间几乎相同;也许有一些我不知道的快速技巧?
这是我进行基准测试的方法:
#!/usr/bin/env perl
use 5.012;
use strict;
use List::Util qw/sum/;
use Benchmark qw/timethese/;
timethese ( 1000000, {
list_util => sub {
my $CheckDigit = \"999989989\";
do {
$CheckDigit = sum( unpack( \'AAAAAAAAA\', $CheckDigit ) );
} while ( $CheckDigit > 9 );
},
perl_only => sub {
my $CheckDigit = \"999989989\";
do {
$CheckDigit = unpack( \'%16S*\', pack( \'S9\', unpack( \'AAAAAAAAA\', $CheckDigit ) ) );
} while ( $CheckDigit > 9 );
},
} );
没有找到相关结果
已邀请:
2 个回复
容淑阔九
结果:
垫歌蝎降凤
产生:
因此,如果必须将字符串分成字符,characters5ѭ似乎是最好的选择。 但是,反复对数字求和几乎与取模mod 9相同(如mirod所指出的)。不同之处在于
产生0而不是9。一个修正的公式是
,但是(至少在Perl中)不适用于全零情况(产生9而不是0)。在Perl中有效的表达式是
。第一项处理全零情况,第二项处理正常情况,第三项将0更改为9。