2

Win32アプリケーションでは、デバッグビルドとリリースビルドのパフォーマンスに大きな違いがあるという問題がありました。リリースには20秒かかりますが、デバッグビルドでアプリケーションを初期化するには6分かかります。デバッグするとき、何かを始める前に初期化を進めるのに常に6分かかるので、これは苦痛です。だから私はデバッグビルドでパフォーマンスを調整する方法を探しています。

プロファイラーを実行した後、以下のコードがホットスポットであることがわかりました。

class CellList {
    std::vector<CellPtr>* _cells;
    iterator begin() { return (*_cells).begin(); }
    iterator end()   { return (*_cells).end(); }
    reverse_iterator rbegin() { return (*_cells).rbegin(); }
    reverse_iterator rend()   { return (*_cells).rend(); }
    ...
}

CellList _cellList = ...;

for (CellList::iterator itr = _cellList.begin(), end = _cellList.end(); itr < end; ++itr) {
  Cell* cell = *itr;
  if (cell->getFoo()) cell->setBar(true);
  else cell->setBar(false);
}

for (CellList::iterator itr = _cellList.rbegin(), end = _cellList.rend(); itr < end; ++itr) {
  Cell* cell = *itr;
  if (cell->getFoo2()) cell->setBar2(true);
  else cell->setBar2(false);
}

そして、これらはタイムベースプロファイルの結果のホットスポットです。

std::operator< <std::_Vector_iterator<Cell *,std::allocator<Cell *> >,std::_Vector_iterator<Cell *,std::allocator<Cell *> > >
std::_Vector_const_iterator<Cell *,std::allocator<Cell *> >::operator<
std::reverse_iterator<std::_Vector_iterator<Cell *,std::allocator<Cell *> > >::operator*
std::reverse_iterator<std::_Vector_const_iterator<Cell *,std::allocator<Cell *> > >::reverse_iterator<std::_Vector_const_iterator<Cell *,std::allocator<Cell *> > ><std::_Vector_iterator<Cell *,std::allocator<Cell *> > >

インライン化されていないのはイテレータ操作であり、この大きな違いを引き起こしていると思います。これを改善する方法はありますか?ソースコードを1行ずつステップ実行し、すべての変数値を確認できる限り、リリースモードでデバッグできます。

4

4 に答える 4

3

違いは正常です。私がすることは場所です

#pragma optimize("",off)

#pragma optimize("",on)

チェックしたいメソッドの周りで、残りのビルドをリリースモードのままにします。

于 2012-08-25T06:52:30.543 に答える
2

6分と20秒の比率は18:1です(簡単にするために20:1と呼びます)。

これは、デバッグバージョンがその時間の95%を、リリースバージョンではない余分なことを行うために費やしていることを意味します。

OK、デバッガーで実行します。一時停止ボタンを押して、コールスタックを確認します。延長戦に何がかかっているかがわかる可能性は19/20です。確かにそれを数回行います。

私がこれをしたとき、それはリリースモードでオフになっているクラス検証メソッドを実行していました。多くの場合、同じデータを異なるパスで何度も再検証していました。

あなたの場合、それはそれらのイテレータかもしれません。他に多くのことをしていない場合は、簡単に支配的になる可能性があります。

しかし、推測しないでください。

于 2012-08-25T12:56:49.233 に答える
2

1つの問題は、VC ++デバッグビルドでデフォルトでオンになっている「高速デバッグチェック」により、コードが最大5倍遅くなることです。彼らは時々バグを見つけますが、あなたが見ているコストを正当化するのに十分ではないことがよくあります。詳細については、私のブログ投稿を参照してください。

Visual C ++デバッグビルド–「高速チェック」により5倍の速度低下が発生する

それらをオフにすると、すべての小さな機能が著しく速くなります。

于 2012-10-10T23:16:14.980 に答える
1

スローダウンがデバッガー内での初期化のみである場合(ただし、通常のアプリケーションとしてデバッグビルドを実行する場合はそうではありません)、使用しているすべてのライブラリのデバッグシンボルをVisualStudioが読み込んでいることが原因です。これは予想されることですが、デバッグ設定からロードされるシンボルを微調整できます。

もちろん、最適化の欠如は一般的に物事を遅くしますが、特にデバッガー内の起動時には遅くなりません。

于 2012-08-25T08:24:30.230 に答える