塵も自摸れば山となる...らしい
以下のようなコードをプロファイラにかけてみた。
#include <stdio.h> #include <sys/select.h> int test(int s, fd_set *fds) { int i; FD_ZERO(fds); for (i = 0; i < s; i++) { FD_SET(i, fds); } return 0; } int test2(int s, fd_set *fds, fd_set *fdm) { *fds = *fdm; return 0; } int main() { int s; int i; fd_set fdm; fd_set fds; FD_ZERO(&fdm); FD_SET(1, &fdm); FD_SET(0, &fdm); s = 2; for (i = 0; i < 100000; i++) { test(s, &fds); test2(s, &fds, &fdm); } }
test()もtest2()もfd_set型のfdsに特定のビットパターンを設定するというもので、片や愚直(test)、片や、手抜き(test2)。ふだん手抜きパターンばっかり使っていたのだが、ふとしたことでどっちがよいのか調査する羽目になった。
% gcc -pg b.c % ./a.out % gprof a.out Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ns/call ns/call name 100.00 0.03 0.03 100000 300.00 300.00 test 0.00 0.03 0.00 100000 0.00 0.00 test2 ...(snip)
まぁ他にやることが無いからとはいえ、これほど差がでちゃうとはおもわなかった。実際はfd_setを初期化するってことは、select()を呼ぶってことで、そのとき毎回fd_setを初期化するというのは馬鹿にならない処理だというのを実感したのであった。