● 実行速度について - 乗除算を避ける・変更する
結果が変わらない乗除算を避ける
- 被乗数・乗数が 0 や 1 の定数の場合(x × 0 、1 × y 等)
- 被除数が 定数 0 の場合(0 ÷ y )
- 除数が定数 1 の場合(x ÷ 1)
- 同じ値同士の除算(x ÷ x )
- 逆数(小数点以下を表現できるメカニズムを持っていない場合)
etc.
これらは、設計段階で結果が判っているはずなので、速度効率を改善するつもりなら、上記のような乗除算の使用を避けるべきです。計算手順をソースコード上で明確にしておきたい場合は、コメント文がその役割を十分果たします。
FIXEDVAL値のゼロを作成する場合、0 × x や 0 ÷ x 、x − x 、x ∨ x 等の演算よりも、memset で普通にゼロクリアした方が効率的です。また、1 を作成する場合は、定数をコピーする処理にした方が効率的です。
int function(PFIXEDVAL pval)
{
static FIXEDVAL const_1[SIZE] = { 1 };
memcpy(pval,const_1,SIZE);
・
・
・
定数は、グローバルか静的領域にします。スタックにすると、関数が実行される度に初期化を行うので、非効率的です。
0 、1 以外の定数作成には、次のようなツールがあると便利です。
参考.FIXEDVAL定数作成ツール
#include <stdio.h>
#include "fixedX.h"
#define BIT 数値幅(bit)
#define SIZE (BIT / 8)
#define PARAM_NAME "変数名"
void main(void )
{
FIXEDVAL val[SIZE];
int i;
fixed_atoui(val,SIZE,"数値");
printf("FIXEDVAL\t\t"PARAM_NAME"[] = {\n\t");
for(i = 0;i < SIZE;i++){
printf("0x%X",val[i]);
if (i != SIZE - 1) printf(",");
}
printf("\n};\n");
}