速度と設計に関する簡単な考察
例えば,double型の大きな配列全てに2つの演算(ここでは+aと*b)を行うことを考える.ざっと思いつくところで,以下の3つが考えられるが,どのくらい速度に差があるのか計ってみた.
[環境]
AMD Athlon(tm) 64 Processor 3000+, 1GB RAM
FedoraCore4 kernel 2.6.11, JDK 1.5.0_04
[実験]
// loop2-1 2つの演算を別のループで行う
for(int i=0; i<count; i++){
va[i] = va[i] + a;
}
for(int i=0; i<count; i++){
va[i] = va[i] * b;
}
// loop2-2 2つの演算を同じループで行う
for(int i=0; i<count; i++){
va[i] = va[i] + a;
va[i] = va[i] * b;
}
// loop2-3 2つの演算を同時に行う
for(int i=0; i<count; i++){
va[i] = (va[i] + a) * b;
}
ループの実行順序を変えたりしながら,3,000,000回のループで測定したところ,およそ
loops-1 = 49.7
loops-2 = 36.7
loops-3 = 25
(単位はmsec)
という結果が得られた.まあ,予想通りと言えばそれまでだけど…
この結果から,loop-3のようなロジックを意識してコーディングするのが正しいように見える.しかし,モジュールやメソッドの独立性や再利用性を考慮すると,必ずしもそうとうは言えない.+aと*bの再利用性を高まるためには,loop-1のように分けておくことも必要である.
高速性と汎用性は,常に相反するものだ.ただ,どちらか一方少し崩したとき,もう一方に大きな効果を生み出すことはよくあることだ.上記のような実験は単純ながらも,高速性と汎用性のバランスを考えるための一つの方法であると思う.
■2005/08/30のチェック
・×ビジョンの意識
・×ビジョンにそった行動
・○回りの人を思いやっているか
・○凡事徹底のチェック
・○blogを書く
・×専門分野の知識を得る
・○専門外の知識を得る
・×仕事とは別に何かを作り続ける
・×ピアノの練習
・×朝きちんと起きる
・×ウォーキング(→夏風邪のため一時中断)
関連エントリー
トラックバック
このエントリーのトラックバックURL:

