2010年8月26日木曜日

AWKプログラムを速く動かす方法 - AWK

AWKプログラムを動かす
お気に入りのAWKプログラムを毎日実行していて、「もう少し速く動かしたいなあ」と思った事はありませんか。
その時には、次のような方法を使う事が出来そうです。


**** 手順
** 書き方を工夫する方法
o AWKにとって無駄な処理が少なくなるように書くと、概ね速くなります。
o 処理系によっては、得意な処理や不得意な処理があります。ですので、特定の処理系に特化して高速化する事も出来ます。
   + 例えば、文字列の連結について、Gawk on Windows 3.1.7では sprintfよりも値を並べる方が速かったです
   + 特定の処理系に特化する方法は、将来のバージョンでも有効とは限りません。

** 時間のかかる部分だけ、他のプログラムを呼び出す方法
o 遅い部分を、その処理が得意なプログラムや言語に任せてしまう方法です。
o 大きく分けて、2種類の方法があります。
o バッチファイル(Windows)やスクリプトから、AWKと他のプログラムを別々に呼び出す方法
   + お手軽なのは、AWKの実行結果をファイルに保存してから、別プログラムにファイルを渡す方法です。
      + 途中でファイルが出来ますので、一部分だけ実行する事も簡単に出来ます。
   + AWKで、他のプログラムを呼び出すバッチファイルを作る事も出来ます。
   + パイプを使って、AWKの処理結果を他のプログラムに渡す事も出来ます。
o AWKの内部から、他のプログラムを実行する方法
   + getline関数を使う方法と、system関数を使う方法があります。

** 速いAWK処理系を使う
o おそらく、mawk系が最速です。日本語を扱う場合は、mawk32が有名です。
   + mawk32の入手方法は「Windows版gawk, mawkを入手する方法
o Gawkから移行する場合、3点に注意します。
   + 文字列操作関数は、1バイトを1文字として数えます。日本語を使う場合は要注意です。
   + 数値計算関数に「有効範囲の限界に近い値」や「想定外の値」を渡すと、強制終了する事があります。
        + 詳しくは「数値計算関数使用時の注意点まとめ
   + Gawkの便利機能や各種文字コード対応機能は、使えなくなります。

** AWKから他言語に、ソースコードを移植する
o 自分で書き換える他、変換補助ツールも出ていました。
o AWK to Perl (a2p) / C (awkaなど) / C++ (An AWK to C++ Translator) を見かけました。
o 詳しくは、「AWKプログラムを他の言語に変換する方法。AWK to Perl, C, C++


**** メモ
o 高速化する事で、処理が分かり難くなる事があります。そのような時は、高速化する利点と欠点を考えて、良くなる方法を検討します。


==
関連ページ:
    ▼AWKプログラムを動かす
    ▼AWKプログラムを書く
    ▼AWK
    ▼制作メモ
    > ▼AWKプログラムを書く
(2010年9月11日追加。参考リンク2点)