コード生成が異常に時間が掛るようになった

投稿者: | 2012/07/23

ビルド時間が1時間くらいになってしまいました。今まで1分少々くらいだったのに。

VisualStudioの出力を見ているとコンパイルやリンクは数秒で終わり、コード生成が大半の時間を占めていました。この現象はスクリプトでコードを書いている部分で3倍くらい増やして1万5千行くらいになったら突然発生しました。このためテストコードを全部ビルドするだけで10時間以上掛りさすがに問題だということで調査しました。

結論から言うと参照渡しの使い方がおかしかったようです。これを修正したらビルドが1分くらいで終わるようになりました。(ライブラリのビルドも含めればもっとしますが。)
具体的には以下のような感じです。Mul関数の第1引数が参照渡しなのにそのまま引数で渡していたのが問題のようです。(こういうのって警告レベルを最大にしておけば警告が出た気がするのに・・。)

reinterpret_cast<Vector3f*>(&vtx[0].p)->Mul(Vector3f(-1.0f, 1.0f, 0.0f), matrix);
reinterpret_cast<Vector3f*>(&vtx[1].p)->Mul(Vector3f( 1.0f, 1.0f, 0.0f), matrix);
reinterpret_cast<Vector3f*>(&vtx[2].p)->Mul(Vector3f(-1.0f,-1.0f, 0.0f), matrix);
reinterpret_cast<Vector3f*>(&vtx[3].p)->Mul(Vector3f( 1.0f,-1.0f, 0.0f), matrix);

Vector3f &Vector3f::Mul(const Vector3f& v, const Matrix44 &m){
     
     x     = v.x * m.m_[0][0] + v.y * m.m_[1][0] + v.z * m.m_[2][0] + m.m_[3][0];
     y     = v.x * m.m_[0][1] + v.y * m.m_[1][1] + v.z * m.m_[2][1] + m.m_[3][1];
     z     = v.x * m.m_[0][2] + v.y * m.m_[1][2] + v.z * m.m_[2][2] + m.m_[3][2];

     return *this;
}
reinterpret_cast<Vector3f*>(&vtx[0].p)->Mul(qv0, m);
reinterpret_cast<Vector3f*>(&vtx[1].p)->Mul(qv1, m);
reinterpret_cast<Vector3f*>(&vtx[2].p)->Mul(qv2, m);
reinterpret_cast<Vector3f*>(&vtx[3].p)->Mul(qv3, m);

VisualStudioではうまいことやってくれているらしく一応正常に動作していました。しかしこのような副作用が出るとは。


コメントを残す

メールアドレスが公開されることはありません。