2011年8月19日金曜日

C語高速化のコツ

ちょっと気になったのでメモ

たとえば
byte data[8,8];
っていうのがあったとして そこにデータを入れたい場合 一番手っ取り早いのは


char x, y;
for (x = 0; x < 8; x++) {
for (y = 0; y < 8; y++) {
data[x, y] = ((関数の引数[x] >> y) ? 1 : 0);
}
}

みたいなかんじのコードが楽
だけど PICの場合かなり高コストになっちゃう
ということで 実行速度をなるべく早くしたいなら


char x;
for (x = 0; x < 8; x++) {
data[x, 0] = ((関数の引数[x] >> 0) ? 1 : 0);
data[x, 1] = ((関数の引数[x] >> 1) ? 1 : 0);
data[x, 2] = ((関数の引数[x] >> 2) ? 1 : 0);
data[x, 3] = ((関数の引数[x] >> 3) ? 1 : 0);
data[x, 4] = ((関数の引数[x] >> 4) ? 1 : 0);
data[x, 5] = ((関数の引数[x] >> 5) ? 1 : 0);
data[x, 6] = ((関数の引数[x] >> 6) ? 1 : 0);
data[x, 7] = ((関数の引数[x] >> 7) ? 1 : 0);
}

とかのほうが 早くなると思う

まぁ場合によって多少違うだろうけど
forをネストすると実効速度がどんどん遅くなる っていう感じらしい

"ループ文同士での入れ子はループ文を多用するために、プログラミングのミスによるバグの一つである無限ループが発生しやすくなる。"
ということらしいので
やっぱなるべくネストはしないほうがいいらしい

0 件のコメント:

コメントを投稿