apache のログ解析を行うときに、時間を localtime にあわせるためにsugi 氏のパッチを使ってみたんだけど、ノーマル状態より極端に遅い。
ノーマル状態: 1466667 records (23 bad) in 35.72 seconds, 41060 l/sec force localtime パッチをあてた状態: 1466667 records (23 bad) in 657.49 seconds, 2230 l/sec
で、調べてみたら mktime() が遅いみたい。
mktime() を呼び出しているところを定数にした場合: 1466667 records (23 bad) in 40.45 seconds, 36258 l/sec
で、同じのを unstable(ほぼ同じ性能のマシン)で実行すると
1466667 records (23 bad) in 61.25 seconds, 23945 l/sec
なので、etch の mktime() の性能が極端に悪いようだ。
前回の日記の続きみたいなもの。
検索ワードの日本語対応をまじめにやろうと考えて、いろいろ試行錯誤していたんだけど、パフォーマンスや正確さ・コストを考えて、nkf を使って文字コード判別 & 変換を行うことにした。参考にしたのは、libnkf-ruby のコード。C なんて滅多に使わないから、いろいろハマったけど、なんとかうまく変換できるところまでいった(これに一日かかるっていうのはどうよ… orz)。
それはいいんだけど、最終的に html ファイルに書くところで SEGV で落ちてしまうようになった。何が悪いんだか全くわからなくて、ソースとにらめっこ。どうやら、書いたコードが悪いのではなくて、nkf のソースを include するだけでこうなってしまうことがわかった。
gdb で落ちるところをみてみると、こんな感じ。
Program received signal SIGSEGV, Segmentation fault.
0xb7e036c9 in vfprintf () from /lib/libc.so.6
(gdb) bt
#0 0xb7e036c9 in vfprintf () from /lib/libc.so.6
#1 0xb7e0c8e2 in fprintf () from /lib/libc.so.6
#2 0x08050792 in td_transfer_str (value=0x80ce900 "3.05 Kb")
at output.c:149
#3 0x08051d92 in hourly_total_table () at output.c:957
#4 0x0805b5a9 in write_month_html () at output.c:539
#5 0x0806c457 in main (argc=Cannot access memory at address 0x0
) at awffull.c:1096
(gdb)
「libc の中かよ!」と思いつつも、原因がわからず途方にくれていたんだけど、ぐぐってみたら「libc6: Segmentation fault in printf()/vfprintf()/strlen()」というのがあった。この件は全く違う話なんだけど、もしかして libc のバグかも!? と思って etch 環境で同じソースをビルドして実行したら全く問題なし…。gotom 先生なんとかしてくれよとか思ったけど(ヒドい)、試しにこの etch バイナリを unstable に持ってきて動かしたら…動くんだなこれが。ということは、gcc のバグなのかなぁ? それとも、gcc がまともになったから動かなくなったのか…。