2012/01/29(日) [n年前の日記]
#1 [processing] Processingって書き方で処理速度が変わるのだな
書き方がマズい気もするけれど。
などと書きつつも。数回〜数十回程度のループではほとんど差が見えてこないのも事実。また、同じ処理を書いても、1回目と2回目で結果が変わってくることにも気付いた。1度通った部分はキャッシュに載るとか最適化されるとか何かイイ感じに処理をしてくれているのかもしれない。となると、ソースの書き方で最適化できる場面などそんなにない、小手先のアレコレなど気にせず書きたいように書けばいい、と言えそうな予感もあり。
// ベンチマーク int[] a = new int[256]; int idx; int s; int e; int count = 1024 * 768 * 60 + 32; idx = 0; s = millis(); for ( int i=0; i<count; i++ ) { // 計算だけでカウンタ処理 idx = (idx + a.length - 1) % a.length; } e = millis(); println("idx=" + idx + " " + (e-s) + " ms"); idx = 0; s = millis(); int l = a.length; for ( int i=0; i<count; i++ ) { // 計算だけでカウンタ処理(a.length を変数に入れておく) idx = (idx + l - 1) % l; } e = millis(); println("idx=" + idx + " " + (e-s) + " ms"); idx = 0; s = millis(); for ( int i=0; i<count; i++ ) { // 計算だけでカウンタ処理(2進数として都合のいい値の場合) idx = (idx -1) & 0x0ff; } e = millis(); println("idx=" + idx + " " + (e-s) + " ms"); idx = 0; s = millis(); for ( int i=0; i<count; i++ ) { // 条件判断でカウンタを減らす idx--; if ( idx < 0 ) { idx += a.length; } } e = millis(); println("idx=" + idx + " " + (e-s) + " ms");
idx=224 377 ms idx=224 388 ms idx=224 27 ms idx=224 30 ms8/16bitのCPU上でアセンブラソースを書いてた頃は、加減算より条件分岐のほうが1命令あたりのクロック数が多かったりもしたので、条件分岐を使わない書き方のほうがえてして速く、常に総クロック数も安定していた記憶があり、つい計算だけでこういう処理を書いちゃったりしてたのだけど。もう全然そういう時代じゃないのだなとなんとなく思ったりして。
などと書きつつも。数回〜数十回程度のループではほとんど差が見えてこないのも事実。また、同じ処理を書いても、1回目と2回目で結果が変わってくることにも気付いた。1度通った部分はキャッシュに載るとか最適化されるとか何かイイ感じに処理をしてくれているのかもしれない。となると、ソースの書き方で最適化できる場面などそんなにない、小手先のアレコレなど気にせず書きたいように書けばいい、と言えそうな予感もあり。
◎ どちらかというと描画面積のほうが関係してそう。 :
Atomを載せてるネットブック、Lenovo IdeaPad S10-2 上で実験してみたけれど。ウインドウサイズが大きいと30FPSすら間に合わないが、ウインドウサイズを小さくして試していくと30FPSが出るようになった。つまり、ソースの書き方より、描画面積を小さくするほうが、効果が高い気がする。
[ ツッコむ ]
以上、1 日分です。