鶏頭のプログラム

Ruby, Javascript, C言語, SQLなどのプログラミング

printfは遅い

C言語デバッグの時とかに使われるprintfはとてつもなく便利で
とりあえず、一番最初に使われる関数だと思います。

#include <stdio.h>
int main(int argc, char **argv){
  printf("Hello World!\n");
  return 0;
}

私個人としては、どんな言語を始めるにしても
とりあえず "Hello World!" を出力するプログラムを書くのがプログラミングの神様への
礼儀だと思っています。

というのはどうでもいい話なのですが、今回はprintfはとてつもなく遅いというお話です。

私もあまり気にしたことはないのですが
今回、WindowsSQLServerをOLE DB経由で呼び出すプログラミングを作成している際に気がつきました。

printfがあるせいで大量データを取得する際に異常に遅くなるのです。

というわけでこんなサンプルを作成しました。

#include <stdio.h>
#include <time.h>

void method1();
void method2();

int main(){
        FILE *fp = fopen("./time.txt", "w");
        clock_t start, end;
        start = clock();
        method1();
        end = clock();
        fprintf(fp, "時間:%.10f\n", (double)(end-start)/CLOCKS_PER_SEC);

        start = clock();
        method2();
        end = clock();
        fprintf(fp, "時間:%.10f\n", (double)(end-start)/CLOCKS_PER_SEC);
        fclose(fp);
        return 0;
}

void method1(){
        int i =0;
        int sum = 0;
        for(i = 0; i < 10000000; i++){
                printf("%d\n", i);
                sum += i;
        }
}

void method2(){
        int i = 0;
        int sum = 0;
        for(i = 0; i < 10000000; i++){
                sum += i;
        }
}

これの結果は一目瞭然で
method1は
時間:2.1418420000
method2は
時間:0.0278430000

printfがないと0.03秒以下なのに
printfがあると2秒以上かかるという結果に。。。
最適化を行わずにコンパイルしたので、ループ処理はどちらも行っています。
(余談ですが最近のコンパイラは異常に賢いので最適化するとmethod2ではコンパイル時に
勝手に計算して値を作成するため実行時にはループしません。)

というわけで実行速度を重視する場合に正規のモジュールを作成する際は
printfを削除していきましょう。