アマプログラマーの独り言


Cランタイムライブラリのススメ

2002年08月31日

Win95以前からプログラムを作っている人は、自作ライブラリを作って、Cランタイムなどは使わずそれらをリンクして動かしていたと思う。(たぶん)
確かにその方が、小さく、そして速いプログラムが組めました。(たぶん)
しかし、最近のウィンドウズはそうでもないんです。
例えば strlen なんかを自作したとしても、Cランタイムの方が速いんです。
管理人はそれを実証してみました。
以下、その結果報告という形でまとめました。

Cランタイム V.S. 自作関数


まず比較対象となる関数はstrlen(文字列の長さを取得する関数)を使う事にした。
動作環境は以下の通り、

OS:    Windows ME
CPU:    1GHz
Compiler: VisualC++ StandardEdition

残念ながら管理人が持っているのは、スタンダードエディション(一番安いやつ)な為、コンパイルの最適化は出来なかった。
使用したソースコードを以下に記す。

------------------------------------------------------
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <conio.h>

#if 1
inline
int strlen(char* str) {
    int i = 0;
    while(str[i])
        i++;
    return i;
}
#endif

int main() {
    char str[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    unsigned long i, t;

    t = timeGetTime();
    for(i = 0; i < 1000000; i++)
        strlen(str);

    printf("%d", timeGetTime() - t);
    getch();
    return 0;
}
------------------------------------------------------

自作関数はこれ以上最小化できるなら誰か教えてください。
実行ファイル(Release版)は3つ作り、それぞれ、

A.exe --- Cランタイム使用
B.exe --- 自作関数使用
C.exe --- 自作インライン関数使用

となっている。
次に、それぞれの実行結果を記す。

ファイル名 1回目 2回目 3回目 4回目 5回目 平均
A.exe 65 66 72 63 76 68.4
B.exe 207 209 212 203 211 208.4
C.exe 208 203 210 200 212 206.6


と、こんな感じになった。
結果だけみればダントツでCランタイムに軍配が上がった。
管理人的には、インライン関数にしてもたいして差がなかった事がいささかショックだったが、1回しか呼んでないわけだしこんなもんか。(ちなみにwhile入れてもインライン化は出来てます)


結果

Cランタイムの方が速い


ただ10万回もループする中で、毎度毎度strlenを呼ぶ輩などいないと思われる。
Cランタイムの方が速いと言っても、この結果は10万回もループしているという事を忘れずに。
他にも何かあれば検証してみたいと思います。