views:

211

answers:

2

So you have this simple program that creates a set from a file :

#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;
}

When you launch this program outside of Visual Express, it will start and close in about half a second.

If you launch this program inside Visual Express with the debugger, in Debug or Release mode, it will close 20 to 25 seconds later. If you put a breakpoint, at return 0; you get your 25 seconds just before exit. And if you pause the program during the 25 seconds, Visual Express will go to xmemory :

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

This is also happening with map. But not with unordered_set or vector. So the question is, why Visual Express is taking so much time deallocating memory with certain kind of associative containers (sorted ones ??) ?

A: 

do you have any expression in the watch window ?

when watching an expression, the debugger has to check regularly if the program entered the context into which the expression is defined. thus, it slows execution down drastically. an old expression entered when debugging something else or even another program may have stayed there, so look at the watch window and remove everything.

this advice is also valid for conditional breakpoints.

Adrien Plisson
No, there's nothing.
anno
A: 

When using the insert() function with a hint-iterator, then you should make sure it actually is a hint. What happens if you insert items without a hint iterator ?

Sdictionnary.insert(line);
Rolf Kristensen