トップ «前の日記(2006年10月23日) 最新 次の日記(2006年10月26日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2006年10月25日

i386 Linux の time() は遅い

ふとした実験をしていて i386 Linux の time(2)は遅いことに気がついた。

30秒間に time() を何階呼び出せるか調べるプログラムを書いて実験してみた。1ループあたりの時間を調べてみる。gcc -O2 でコンパイル。

/*
 * i386 Linux の time() は遅いようだ
 * 30秒間で time() が何回 呼び出せるか実験するプログラム
 */
 
#include 
#include 
#include 
 
#define CALC_SEC 30	// 計算時間[単位=秒]
 
int main(){
	int count = 0;
	time_t end = time(NULL)+CALC_SEC;	// 処理の終わり = 現在時刻+30秒
 
	while(end>time(NULL)){			// グルグル回り
		count++;
	}
 
	printf("1loop = %lf micro sec\n",(double)(CALC_SEC*1000000/(double)count));
	return 0;
}
ホスト time()
PC Linux (Pentium4, 2.80GHz)2.984769
Cygwin (Core solo, 1.06GHz) 0.314861
CAT760 (SH4, 200MHz) 2.077872
([単位=マイクロ秒]小さいほど速い)
PC Linuxが一番遅い。CAT760よりも遅い。なんでだろ?時計ICを見に行っているのか??

次に、同じ試験をclock(3)に書き換えて実験してみる。

int main(){
	int count = 0;
	clock_t end = clock()+CALC_SEC*CLOCKS_PER_SEC;	// 処理の終わり = 現在時刻+30秒
 
	while(end>clock()){			// グルグル回り
		count++;
	}
 
	printf("1loop = %lf micro sec\n",(double)(CALC_SEC*1000000/(double)count));
	return 0;
}
結果
ホスト time() clock()
PC Linux (Pentium4, 2.80GHz)2.9847690.672957
Cygwin (Core solo, 1.06GHz) 0.3148611.439811
CAT760 (SH4, 200MHz) 2.0778723.981758
([単位=マイクロ秒]小さいほど速い)
今度はま逆で PC Linuxが早くて、Cygwin と CAT760 は先ほどの実験よりも遅くなってしまった。でも結果はほぼ性能比か。
理由までは分からないが、PC Linux の time()は遅いらしい。非intelだと早い。不思議。なんだかこういう小さなところが気になってしかたがないオイラ。

DDforWindows

うちでフリーで公開している DDforWindowsが@ITで紹介されていた。(^-^)
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/954linuximgwin.html