awk のパフォーマンス
試しは、Fedora 16 上で行いましたが、常用している CentOS 5 (or RHEL5) でも簡単に利用できるかどうか EPEL を見てみたら、有難いことに提供されてました。
というわけで、まず、インストールを。
[root@centos5 ~]# uname -a Linux centos5 2.6.18-274.7.1.el5 #1 SMP Thu Oct 20 16:21:01 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux [root@centos5 ~]# yum install mawk --enablerepo=epel Loaded plugins: downloadonly, fastestmirror Loading mirror speeds from cached hostfile * base: www.ftp.ne.jp * epel: ftp.jaist.ac.jp * extras: www.ftp.ne.jp * updates: www.ftp.ne.jp Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package mawk.x86_64 0:1.3.4-5.20100625.el5 set to be updated --> Finished Dependency Resolution Dependencies Resolved ========================================================================================== Package Arch Version Repository Size ========================================================================================== Installing: mawk x86_64 1.3.4-5.20100625.el5 epel 104 k Transaction Summary ========================================================================================== Install 1 Package(s) Upgrade 0 Package(s) Total download size: 104 k Is this ok [y/N]: y Downloading Packages: mawk-1.3.4-5.20100625.el5.x86_64.rpm | 104 kB 00:00 Running rpm_check_debug Running Transaction Test Finished Transaction Test Transaction Test Succeeded Running Transaction Installing : mawk 1/1 Installed: mawk.x86_64 0:1.3.4-5.20100625.el5 Complete! [root@centos5 ~]#
次のテスト用の awk スクリプトは、a から zzzz までの文字列 (Linux の SCSI ディスク名の sdXX の XX 部分に使われている) を出力するものです。適度に重いかと。。
# # Note: This awk script prints # a, b, ... z, aa, ab, ... zz, aaa, aab, ... zzz # function get_sdstr(n, r,ret) { for (;;) { if (n <= 26) { return letter[n]""ret } else { r = n % 26 ; r = r ? r : 26 ret = letter[r]""ret n = (n-r)/26 } } } BEGIN { for (i=1; i <= 26; i++) { letter[i] = substr("abcdefghijklmnopqrstuvwxyz",i,1) } for (i=1; i <= (26+26*26+26*26*26+26*26*26*26); i++) { print get_sdstr(i) } exit(0) }これを、gawk と mawk でそれぞれ実行して、/usr/bin/time でパフォーマンス測定した結果が、次の通りです。
[root@centos5 ~]# md5sum test.awk ee228358d1513e48e0495e1e79f3956c test.awk [root@centos5 ~]# rpm -q gawk gawk-3.1.5-14.el5 [root@centos5 ~]# rpm -q mawk mawk-1.3.4-5.20100625.el5 [root@centos5 ~]# [root@centos5 ~]# /usr/bin/time gawk -f ./test.awk | md5sum 3.43user 0.01system 0:03.47elapsed 99%CPU (0avgtext+0avgdata 3824maxresident)k 0inputs+0outputs (0major+279minor)pagefaults 0swaps a9de67bf77dec1b5285ee27f71ab3564 - [root@centos5 ~]# [root@centos5 ~]# /usr/bin/time mawk -f ./test.awk | md5sum 1.48user 0.00system 0:01.49elapsed 99%CPU (0avgtext+0avgdata 2976maxresident)k 0inputs+0outputs (0major+220minor)pagefaults 0swaps a9de67bf77dec1b5285ee27f71ab3564 -このように、2倍くらい速いです。
まあ、処理内容によるでしょうけど、わたしが日頃使う手持ちスクリプトは軒並み2倍速かったので、これからは有難く常用させてもらおうと思います。作者さん&メンテナー様に感謝。
EPEL の使い方については、次の記事を参照ください。
CentOS 6 で ntfs をマウントする
なお、CentOS 6 (or RHEL6) 用の EPEL チャネルにも mawk ありました。
gawk で性能足りないということがあったら、最後の切り札に使える場合があるかも。ただし、GNU 拡張等、互換性に注意する必要がある。