我正在编写一个Perl脚本,我需要在其中循环遍历字符串的每个字符.有很多字符串,每个字符串长100个字符(如果你想知道的话,它们是短的DNA序列).
那么,使用substr一次提取一个字符是否更快,或者将字符串拆分为数组然后迭代数组更快?
在我等待答案时,我想我会读到如何在Perl中对事物进行基准测试.
解决方法
这实际上取决于你对数据做了什么 – 但是,嘿,你的最后一个问题正朝着正确的方向发展!不要猜,基准.
Perl为这类东西提供了Benchmark模块,使用它非常简单.这是一个开始使用的示例代码:
#!/usr/bin/perl use strict; use warnings; use Benchmark qw(cmpthese); my $dna; $dna .= [qw(G A T C)]->[rand 4] for 1 .. 100; sub frequency_substr { my $length = length $dna; my %hist; for my $pos (0 .. $length) { $hist{$pos}{substr $dna,$pos,1} ++; } \%hist; } sub frequency_split { my %hist; my $pos = 0; for my $char (split //,$dna) { $hist{$pos ++}{$char} ++; } \%hist; } sub frequency_regmatch { my %hist; while ($dna =~ /(.)/g) { $hist{pos($dna)}{$1} ++; } \%hist; } cmpthese(-5,# Run each for at least 5 seconds { substr => \&frequency_substr,split => \&frequency_split,regex => \&frequency_regmatch } );
并得到一个样本结果:
Rate regex split substr regex 6254/s -- -26% -32% split 8421/s 35% -- -9% substr 9240/s 48% 10% --
原来,substr的速度惊人.