1

Devel::NYTProf でスクリプトを実行すると、コードの次の部分が実行時間の大部分を占めていることがわかりました。この関数は、操作しやすいハッシュを作成し、そのハッシュを配列にプッシュします。それほど時間をかけずにこれを行うにはどうすればよいか疑問に思っています。

Devel::NYTProf から:

# Statements | Time on line | Calls | Time in sub
21092   16.4s   21092   273s     push( @events, { create_events_hash($1, $2, $j, @eventHash) } );
# spent 273s making 21092 calls to Parser::create_events_hash, avg 12.9ms/call

# ...                   

# spent 273s (268+4.95) within Parser::create_events_hash which was called 21092 times, 
    avg 12.9ms/call: # 21092 times (268s+4.95s) by 
    Parser::findNewMessages at line 86, avg 12.9ms/call  
# Statements | Time on line 

sub create_events_hash {
    21092   159s            my ( $dateIndex, $msgIDIndex, $eventHashIndex, @eventHash ) = @_;                       

    21092   81.8ms          my %holder;
    21092   137ms           $holder{ID} = $eventHashIndex;
    21092   190ms           $holder{msgDate} = $dateIndex;
    21092   243ms           $holder{ReceivedAt} = $eventHash[$eventHashIndex]{ReceivedAt};
    21092   181ms           $holder{msgID} = $msgIDIndex;
    21092   193ms           $holder{FromHost} = $eventHash[$eventHashIndex]{FromHost};
    21092   187ms           $holder{Priority} = $eventHash[$eventHashIndex]{Priority};

    21092   97.6s           return %holder;
                    }   
4

2 に答える 2

6

手始めに、@eventhash を参照として送信します。

push(@events, {create_events_hash($1, $2, $j, \@eventHash)});

配列のコピーを作成しないため、その方が効率的です。

于 2012-07-06T14:50:21.227 に答える
1

代入ステートメントの束から多くの時間を実際に絞り出すことはできないかもしれません。

アルゴリズムを調べる必要があるかもしれませんが、なぜサブ 21k 回呼び出すのですか?

すでにハッシュの配列があります。たぶん、あなたは本当に非効率的な方法で繰り返しています。

さらに、ハッシュ参照ではなく、ハッシュを関数に渡しています。@Hameedが提案したように、参照を渡してみてください。また、参照を渡してみて、それが何をするかを見てください。

参照を渡すことはおそらくコードへの影響が最も少なく、参照とオブジェクトを渡すことがランタイムにどのような影響を与えるかを確認できます。しかし、Hameed に同意します。渡す大きな配列は、返す小さなハッシュよりもスタックにコピーするのに時間がかかります。

于 2012-07-06T15:32:42.780 に答える