アマプログラマーの独り言
| 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 --- 自作インライン関数使用 となっている。 次に、それぞれの実行結果を記す。
と、こんな感じになった。 結果だけみればダントツでCランタイムに軍配が上がった。 管理人的には、インライン関数にしてもたいして差がなかった事がいささかショックだったが、1回しか呼んでないわけだしこんなもんか。(ちなみにwhile入れてもインライン化は出来てます) 結果 Cランタイムの方が速い ただ10万回もループする中で、毎度毎度strlenを呼ぶ輩などいないと思われる。 Cランタイムの方が速いと言っても、この結果は10万回もループしているという事を忘れずに。 他にも何かあれば検証してみたいと思います。 |