Visual C++ Express, the debugger, sorted associative containers and memory deallocation
So you have this simple program that creates a std::set
from a file :
#include <fstream>
#include <string>
#include &开发者_运维问答lt;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 std::map
. But not with std::unordered_set
or std::vector
. So the question is, why Visual Express is taking so much time deallocating memory with certain kind of associative containers (sorted ones ??) ?
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.
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);
精彩评论