このページは、2019年3月に保存されたアーカイブです。最新の内容ではない場合がありますのでご注意ください


C言語・処理の高速化



 C言語プログラムの処理を高速化する。
 高速化の手段として、処理ステップ数を減らす、メモリアクセス量を減らす、コンパイルでより最適化されるようにする、などがある。



演算処理回数を減らす



メモリアクセスを減らす

    ◎配列を操作する場合、インデックスではなく、ポインタで操作する
    for(i=x1; i<= x2; i++){
     disp_f_gram_ptr->ram[y1][i] = color;
    }
    word* p = &((word*)disp_f_gram_ptr->ram[y1])[x1];
    for(i=x1; i<= x2; i++) {
     *p++ = color;
    }
    ※ループ内の処理が2ステップ減る。

    ◎データのロード/ストアは可能な限り 32ビット単位で行う
    for(x=len; x>0; y--){
     outpw( LCD_L2F50052_DATA, *bitmap_ptr );
    }
    for(x=len; x>0; y--){
     dword wk = *(dword*)bitmap_ptr;
     outpw( LCD_L2F50052_DATA, wk );
     outpw( LCD_L2F50052_DATA, wk>>16 );
     bitmap_ptr += 2;
    }

    ◎データコピー処理について、ポインタ渡しを使用する
    [memset()][memcpy()][memmove()][strcpy()][strncpy()][strcat()][strncat()]の使用箇所は適切か。

    ◎関数をインライン展開する
    関数呼び出しもコストがかかるため。
    ※ただしプログラムROMサイズは増加する。

    ◎仮引数や自動変数は極力少なくする。
    仮引数や自動変数の数が多いとそれはレジスタに格納されずスタックに置かれてしまう。


最適化されるようにする

    ◎register変数を使用しない
    register変数の使用はコンパイラの最適化を妨げる。

    ◎多選択の文を使用しない
    switch-case文、if-else if文。
    コンパイラは最適化してくれない。


このページは、2019年3月に保存されたアーカイブです。最新の内容ではない場合がありますのでご注意ください