C/C++のプログラム高速化 (失敗談)

CATEGORYc / c++

パフォーマンス改善で、代入演算子とコピーコンストラクタを一生懸命作った記憶があるのだけれど、どんな問題があって、どのように効果があったのか思い出せない。...
C/C++のプログラム高速化 (続き)

思い出したわ X-)

まだ c++ がよく分かって無かってなくて、const なポインタと参照の区別がついていなかった頃の話。

こんな感じのクラスを書いていたんだった。
class Data {
public:
    Data() {
        ...
    }
    // ↑コピーコンストラクタが無い
    Data operator= (Data data) {
        ...
    }
}
プロファイラの結果を見ると、デストラクタが呼ばれている回数がコンストラクタよりも多いことに気がつく。

どうやって回答にたどり着いたかは思い出せないのだけれど、代入演算子の呼び出しのときの引数と、戻り値を return するときに 暗黙の コピーコンストラクタが呼び出されていたのだった。
で、改善したのが↓。
class Data {
public:
    Data() {
        ...
    }
    Data(Data& data) {    // コピーコンストラクタを追加する
        ...
    }
    Data operator= (const Data& data) {    // 引数は const な参照で渡す
        ...
    }
}

こんなことも分かってなかったくらいだから、getter 系のメソッドが const になってなかったり、単純だけど修正するのにかなり手間がかかった記憶がある。

数値計算系のプログラムだったので、I/O wait がほとんどなく CPU くいまくりのプログラムだったので、地味に効果があった。

今にしてみれば、こんなコードを書くやつが悪い、という程度のレベルなのだけれど、
  • プロファイラの結果に疑問があれば、きちんと原因を追究する
  • 他人のコードを読む
  • 自分の書き方と違っていれば、その意図を理解する
という教訓を身をもって知ったのであった。

# まあ、その後も同じようなことを繰り返すのだけれど :-)
関連記事
スポンサーサイト

c++ 高速化

0 Comments

Leave a comment