8

頻繁に実行される Perl コードを最適化しています (ファイルごとに 1 日 1 回)。

コメントは Perl スクリプトを遅くしますか? 私の実験はノーに傾いています:

use Benchmark;
timethese(20000000, {
    'comments' => '$b=1;
# comment  ... (100 times)
', 'nocomments' => '$b=1;'});

ほぼ同じ値が得られます (ノイズは別として)。

Benchmark: timing 10000000 iterations of comments, nocomments...
  comments:  1 wallclock secs ( 0.53 usr +  0.00 sys =  0.53 CPU) @ 18832391.71/s (n=10000000)
nocomments:  0 wallclock secs ( 0.44 usr +  0.00 sys =  0.44 CPU) @ 22935779.82/s (n=10000000)

Benchmark: timing 20000000 iterations of comments, nocomments...
  comments:  0 wallclock secs ( 0.86 usr + -0.01 sys =  0.84 CPU) @ 23696682.46/s (n=20000000)
nocomments:  1 wallclock secs ( 0.90 usr +  0.00 sys =  0.90 CPU) @ 22099447.51/s (n=20000000)

コメント バージョンとコメントなしバージョンを別々の Perl スクリプトとして実行すると、同様の結果が得られます。

ただし、インタプリタが毎回コメントをメモリに読み込む必要があるとすれば、直観に反するように思えます。

4

9 に答える 9

18

実行時のパフォーマンス? いいえ。

解析と字句解析のパフォーマンス? はい、もちろん。

Perl はオンザフライで解析および lex する傾向があるため、コメントは「起動」パフォーマンスに影響します。

彼らはそれに著しく影響しますか?ありそうもない。

于 2008-11-06T20:03:33.367 に答える
13

Perl はジャストインタイム コンパイル言語であるため、コメントと POD は実行時のパフォーマンスに影響しません。

コメントと POD はコンパイル時間にわずかな影響しか与えませんが、Perl が解析するのは非常に簡単で高速であるため、パフォーマンス ヒットを測定することはほとんど不可能です。-cフラグを使用してコンパイルするだけで、これを自分で確認できます。

私の Macbook では、2 つのステートメントと 1000 行の 70 文字のコメントを含む Perl プログラムをコンパイルするのに、1000 行の空のコメントを含むものと 2 つの print ステートメントのみを含むプログラムをコンパイルするのに同じ時間がかかります。OS がファイルをキャッシュできるように、各ベンチマークを必ず2 回実行してください。それ以外の場合、ベンチマークはディスクからファイルを読み取る時間です。

起動時間が問題になる場合、コメントや POD が原因ではありません。

于 2008-11-06T22:21:58.437 に答える
8

Perl はスクリプトをコンパイルして実行します。コメントは、コンパイル フェーズをわずかに遅くしますが、実行フェーズにはまったく影響しません。

于 2008-11-06T20:03:25.020 に答える
7

Perl は、シェル スクリプトと同じ意味でのスクリプト言語ではありません。インタープリターは、ファイルを 1 行ずつ読み取るわけではありません。Perl プログラムの実行は、コンパイルとランタイムの 2 つの基本的な段階で行われます [1]。コンパイル段階では、ソース コードが解析され、バイトコードに変換されます。ランタイム段階では、バイトコードが仮想マシン上で実行されます。

コメントは解析段階を遅くしますが、スクリプト自体の解析に必要な時間 (ほとんどのプログラムでは既に非常に小さい) に比べれば、その差はごくわずかです。解析時間に本当に関心があるのは、プログラムが 1 秒間に何度も呼び出される可能性がある Web サーバー環境だけです。mod_perl は、この問題を解決するために存在します。

を使用していますBenchmark。それは良い!マイクロ最適化ではなく、アルゴリズムを改善する方法を探す必要があります。Devel::DProf は、ホット スポットを見つけるのに役立つ場合があります。プログラムを高速化するための誤った試みで、コメントを削除してはなりません。あなたはそれを維持できなくするだけです。


[1] これは一般に「ジャスト イン タイム」コンパイルと呼ばれます。Perl には実際には and のような段階がいくつかありますINITが、ENDここでは関係ありません。

于 2008-11-06T20:49:26.067 に答える
3

ポイントは、ボトルネックを最適化することです。ファイルの読み取りは、次のもので構成されます。

  • ファイルを開き、
  • その内容を読んで、
  • ファイルを閉じ、
  • 内容の解析。

これらのステップの中で、読み取りは群を抜いて最速の部分です (閉じるかどうかはわかりません。これはシステムコールですが、終了するまで待つ必要はありません)。全体の 10% であっても (そうではないと思います)、半分に減らしてもパフォーマンスは 5% しか向上しませんが、コメントの欠落が発生します (これは非常に悪いことです)。パーサーにとって、# で始まる行を破棄しても、具体的な速度低下にはなりません。その後、コメントはなくなっているので、スローダウンはあり得ません。

ここで、すべてのコメントを削除することで、「スクリプトの読み取り」部分を実際に 5% 改善できると想像してください (これは非常に楽観的な見積もりです。上記を参照してください)。スクリプトの全体的な消費時間における「スクリプトの読み取り」の割合はどれくらいですか? もちろん、それがどれだけ行うかにもよりますが、perl スクリプトは通常、少なくとももう 1 つのファイルを読み取るため、最大で 50% ですが、perl スクリプトは通常、それ以上のことを行うため、正直な見積もりでは、これを範囲内の何かに引き下げることになります。 1%の。したがって、すべてのコメントを削除することで期待される効率の改善は 最大で(非常に楽観的に) 2.5% ですが、実際には 0.05% に近くなります。そして、実際に 1% を超える値が得られるものは、ほとんど何もしないためすでに高速であるため、再び間違った点で最適化しています。

結論として、ボトルネックを最適化します。

于 2008-11-06T20:54:12.797 に答える
2

この場合、Benchmark モジュールは役に立ちません。コードを何度も実行する時間を測定しているだけです。あなたのコードは実際には何もしないので、そのほとんどは最適化されています。そのため、1 秒間に 2200 万回実行されていることがわかります。

これについては、 Mastering Perlのほぼすべての章を参照してください。ベンチマーク手法での測定誤差は約 7% です。ベンチマークの数値はその範囲内にあるため、実質的に違いはありません。

于 2008-11-06T23:19:44.827 に答える
1

Paul Tomblinsのコメントから:

perlはある種のオンザフライコンパイルを行いませんか?たぶんコメントは早く捨てられますか?– </ p>

はい、Perlはそうします。

これは、コンパイルとインタプリタの中間にあるプログラミング言語です。コードはその場でコンパイルされてから実行されます。コメントは通常、何の違いもありません。おそらく最も効果的なのは、最初にファイルを1行ずつ解析し、事前にコンパイルする場合です。ナノ秒の違いが見られる場合があります。

于 2008-11-06T20:05:17.310 に答える
0

1つのコメントは、ループ内で複数回ではなく、1回だけ解析されると予想されるため、これが有効なテストであるとは思えません。

コメントのコンパイルは少し遅くなると思いますが、コメントを削除するには小さすぎると思います。

于 2008-11-06T20:04:13.927 に答える
0

Perl コメントはスクリプトを遅くしますか? まあ、それを解析します、はい。解析後に実行しますか?いいえ。スクリプトはどのくらいの頻度で解析されますか? 1 回だけです。そのため、for ループ内にコメントがある場合、スクリプトが実行される前に、コメントが解析によって 1 回破棄されます。スクリプトが実行を開始すると、コメントは既に削除されています (スクリプトは、スクリプトによって内部的にスクリプトとして保存されません)。 Perl) のように for ループを何回繰り返しても、コメントは影響しません。パーサーはどのくらいの速さでコメントをスキップできますか? Perl のコメントの処理方法は非常に高速であるため、お気づきではないでしょうか。5 行のコードがあり、各行の間に 1 Mio 行のコメントがある場合、起動時間が長くなることに気付くでしょう...しかし、その可能性はどのくらいで、それほど大きなコメントは何の役に立つのでしょうか?

于 2008-11-06T20:40:49.047 に答える