2

これstd::setで、ファイルからを作成する次の簡単なプログラムができました。

#include <fstream>
#include <string>
#include <set>

int main()
{
 std::set<std::string> Sdictionnary;
 std::set<std::string>::const_iterator it = Sdictionnary.begin();

 std::ifstream file("french.txt"); // A file containing 200 000 lines
 std::string line;
 while(getline(file,line))
 {
  it  = Sdictionnary.insert(it, line);
 }
 file.close();
 return 0;
}

このプログラムを Visual Express の外部で起動すると、約 0.5 秒で起動して終了します。

デバッガーを使用して Visual Express 内でこのプログラムをデバッグ モードまたはリリース モードで起動すると、20 ~ 25 秒後に終了します。ブレークポイントを設定すると、0 が返されます。終了する直前に 25 秒を取得します。25 秒間プログラムを一時停止すると、Visual Express は xmemory に移動します。

 void deallocate(pointer _Ptr, size_type)
  { // deallocate object at _Ptr, ignore size
  ::operator delete(_Ptr);
  }

これも で起こっていstd::mapます。しかし、std::unordered_setまたはではありませんstd::vector。問題は、Visual Express が特定の種類の連想コンテナー (ソートされたもの ??) でメモリの割り当てを解除するのに、なぜそんなに時間がかかるのかということです。

4

2 に答える 2

0

ウォッチウィンドウに表情はありますか?

式を監視するとき、デバッガーは、プログラムが式が定義されているコンテキストに入ったかどうかを定期的にチェックする必要があります。したがって、実行速度が大幅に低下します。他の何かや別のプログラムをデバッグするときに入力された古い式がそこに残っている可能性があるため、ウォッチウィンドウを見てすべてを削除してください。

このアドバイスは、条件付きブレークポイントにも有効です。

于 2009-11-21T13:43:28.770 に答える
-1

ヒント反復子で insert() 関数を使用する場合は、それが実際にヒントであることを確認する必要があります。ヒント iterator なしで項目を挿入するとどうなりますか?

Sdictionnary.insert(line);
于 2010-01-16T23:43:56.607 に答える