awka :awkをC言語に翻訳して早く実行

awkC言語に翻訳して早く実行


コンパイルとインストール

$wget http://awka.sourceforge.net/awka-0.7.5.tar.gz
$gzip -d awka-0.7.5.tar.gz

$tar -xvf awka-0.7.5.tar

$cd awka-0.7.5

$./configure

$make

$make test


使い方
まずこれを作る
awk2c.sh

#!/bin/bash
awka -f $1".awk" >$1".c" 
gcc -c $1".c" -I/usr/local/include -O2 -o $1".o"
gcc $1".o" -L/usr/local/lib -lawka -lm -O2 -o $1
rm *.c *.o

そして、
test.awkを書いて、

sh awk2c.sh test

とすると
cygwinなら

test.exe
./test.exe inputfilename

で実行できる。


リスト表現された約100万ノード、400万
リンクのネットワーク
データの次数を求めるスクリプト

{a[$2]=a[$2]+1}END{for(i in a){print i,a[i]}}

awkそのままだと、
real 0m22.345s
user 0m23.733s
sys 0m0.202s
となり約22秒。


コンパイルすると
real 0m8.766s
user 0m9.749s
sys 0m0.280s
となり、約9秒

だから、約2.5倍程度速くなった。



さらに、
コンパイルオプションをO2にすると
real 0m8.763s
user 0m8.233s
sys 0m0.249s
もう少しだけ速くなる。

http://pstool.dip.jp/cgi-win/cgi-bin/pyukiwiki/index.cgi?%A2%A3%20awka-0.7.5
を参考にさせていただきました。