塵も自摸れば山となる...らしい

以下のようなコードをプロファイラにかけてみた。

#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を初期化するというのは馬鹿にならない処理だというのを実感したのであった。