bashスクリプト最適化処理速度

bashスクリプト最適化処理速度

Bashスクリプトを最適化するための一般的なガイドラインがあるかどうか疑問に思います。

  • たとえば、便利コマンドラインではなくループを作成しますが、これもより速い処理システムのため?例:

    for i in a b c; do echo $i; done
    
    echo a
    echo b
    echo c
    
  • 時々、人々は同じ問題に対して異なる解決策を思い出します。たとえば、sed、 、ともにcut文字列から数字を削除できます。次のコードを使用すると、数値が低いほど速度が速くなると言えるかどうか疑問に思います。awkecho

    1. 同じコマンド

      STRING=abc.def
      echo ${STRING} | sed 's/.def//g'
      echo ${STRING} | sed '$s/....$//'
      
    2. 次のような他のコマンド

      STRING=abc.def
      echo ${STRING} | cut -d . -f 1
      echo ${STRING} | sed 's/.def//g'
      

ベストアンサー1

最適化の最初のルールは次のとおりです。最適化されていません。まずテストしてみてください。テスト結果プログラムが遅すぎると思われる場合は、可能な最適化方法を見つけてください。

確かに知ることができる唯一の方法は、ユースケースをベンチマークすることです。いくつかの一般的なルールがありますが、一般的なアプリケーションの一般的なデータ量にのみ適用されます。

状況によっては、一部の一般規則が適用されない場合があります。

  • シェル内部処理の場合、ATT ksh が最も高速です。文字列操作が多い場合は、ATT kshを使用してください。 Dashが2位で、bash、pdksh、zshが遅れています。
  • 一度に短い操作を実行するためにシェルを頻繁に呼び出す必要がある場合、開始時間が短いためダッシュが勝ちます。
  • 外部プロセスを開始するには時間がかかるため、複雑な部分を含むパイプラインを持つ方がループのパイプラインよりも高速です。
  • echo $fooecho "$foo"二重引用符がない場合は、$foo単語に分割して各単語をファイル名のワイルドカードパターンとして解釈するため、それより遅くなります。さらに、これらの分割とワイルドカードの動作はほとんど必要ありません。したがって、変数置換とコマンド置換には常に二重引用符を入れる必要が"$foo"あることに注意してください。"$(foo)"
  • 特殊目的ツールは、しばしば汎用ツールよりも優れています。たとえば、cutまたは同じツールをhead使用してシミュレートできますが、sed速度sedが遅くなったり遅くなったりしますawk。シェル文字列の処理は遅いですが、短い文字列の場合は、外部プログラムを呼び出すよりもパフォーマンスがはるかに優れています。
  • Perl、Python、Rubyなどの高度な言語を使用すると、より高速なアルゴリズムを書くことができることがよくありますが、開始時間がはるかに長いため、大量のデータを扱う場合にのみ実行する価値があります。
  • 少なくともLinuxでは、パイプは一時ファイルよりも速い傾向があります。
  • シェルスクリプトのほとんどの使用はI / O集約的なプロセスを中心に行われているため、CPUの消費は重要ではありません。

パフォーマンスの問題はシェルスクリプトではほとんど考慮されません。上記のリストは純粋に例示的なものです。ほとんどの場合、違いはほんの数パーセントしかないので、「遅い」方法を使用することをお勧めします。

通常、シェルスクリプトの目的は、タスクをすばやく完了することです。スクリプトの作成に余分な時間を費やすことを正当化するには、最適化によってかなりの利点を得る必要があります。

おすすめ記事