2017-11-01 13 views
4

サブストリング(たとえば1文字)を含むarrayの文字列の要素をフィルタ処理することがよくあります。 regexと一致させるか、.containsの方法を使って行うことができますので、私は小さなテストをして.containsがより速く(したがってより適切である)ことを確認しました。正規表現とPerlでのフィルタリング。

my @array = "aa" .. "cc"; 
my constant $substr = 'a'; 

my $time1 = now; 
my @a_array = @array.grep: *.contains($substr); 
my $time2 = now; 
@a_array = @array.grep: * ~~ /$substr/; 
my $time3 = now; 

my $time_contains = $time2 - $time1; 
my $time_regex = $time3 - $time2; 
say "contains: $time_contains sec"; 
say "regex: $time_regex sec"; 

それから@arrayの大きさと$substrの長さを変更し、各方法は@arrayをフィルタリングするために要した時間を比較します。ほとんどの場合(予想どおり)、.containsは、regexよりもはるかに速く、特に@arrayが大きい場合は。しかし、@array(上記のコードのように)が小さい場合は、regexがやや速くなります。

contains: 0.0015010 sec 
regex: 0.0008708 sec 

どうしてですか?

+2

'perl6 --profile example.p6' –

+0

@BradGilbert素晴らしいツール!しかし、私は結果を解釈することはできません。 –

答えて

4

完全に非科学的な実験では、正規表現のバージョンとそのバージョンを入れ替えただけで、測定しているパフォーマンスの違いは「正規表現対包含」ではなく「実際のものと第2のもの」であることがわかりました:

最初に来る含まれている場合:正規表現が最初に来るとき

contains: 0.001555 sec 
regex: 0.0009051 sec 

:適切

regex: 0.002055 sec 
contains: 0.000326 sec 

ベンチマークdifficuですタスク。間違って何かを把握したいと思っていたものとは違うものを測定するのは本当に簡単です。

複数のもののパフォーマンスを比較したいときは、通常、それぞれのスクリプトを別々のスクリプトで実行するか、共有スクリプトを使用してタスクのうちの1つだけを一度に実行します(たとえば、multi sub MAIN("task1")アプローチを使用します)。そうすれば、スタートアップ作業はすべて共有されます。

freenodeの#perl6 IRCチャンネルには、ベンチマーク可能なbot6があります。これはベンチマークを行うことができます。 the section "Comparing Code" on its wiki pageを読んで、2つのコードをどのように比較できるかを確認してください。