ページ

2011-11-01

strlen(...) > 0とstrlen(...) != 0はどちらが速いか?

うまい文にならなかったが、貴重な結果なので以下にまとめておく。

Loquiでtopicを空にしようとしてもできない、というバグを発見して対応を施した際、
strlen(str)は>0がよいか? != 0がよいか?という話になり、今のご時世問題になるわけのない、
「どちらが速いのか」が話題になった(というかした)
(バグは対策済み:対応内容はこちら https://bugs.launchpad.net/loqui/+bug/689164/comments/3)

結論としては、出力結果が同じになるので、速度は変わらない。しかし、変わらない理由が驚きであった。

話題となるのはこの部分:


上記の部分が入ったソース(irc_message.c)をgcc -Sでアセンブルし、if文のところを抜き出した結果がこちら:


前述の通り、strlen(...) > 0をstrlen(...) != 0にしても、出力結果は変わらないのだが、問題は
出力結果。strlenをコールしていないどころか、これではstr[0] != '\0'のようである。

strlen()の定義を追うと、eglibc-2.13/sysdeps/i386/i486/bits/string.hにあった:


このコードが使われている感じではないので、実際に使われているのはおそらくgccのbuiltin...
どうやらgccがstrlen(...) > 0自体を解釈しているようである。驚くべきgcc.

ちなみに、-O0でも一緒であるが、-fno-builtinをつけるとちゃんとstrlenをコールしてくれる:


まぁ、それでもsize_tがunsignedだったので、結局>0と!=0は出力結果は同じなのであったが。

0 件のコメント:

コメントを投稿