Używam MSVC 2010.Dlaczego ten kod jest 100 razy wolniejszy w debugowaniu?
Próbuję usunąć duplikat (bez zachowania któregokolwiek z nich) z listy
Dlaczego jest to kod 100 razy wolniejszy w trybie debugowania?
Czy istnieje inny sposób usunięcia wszystkich obiektów, które są równoważne i przyspieszenia w trybie debugowania?
To jest do punktu, w którym nie mogę obecnie używać debugowania. Przetwarzanie trwa kilka minut, a zwolnienie trwa kilka sekund.
void SomeFunction()
{
std::list<Something> list;
std::list<Something>::iterator it1;
std::list<Something>::iterator it2;
for (it1 = list.begin(); it1 != list.end(); it1++)
{
for (it2 = list.begin(); it2!=list.end(); it2++)
{
if (it1->SomeValue() == it2->SomeValue())
{
if (it1 != it2)
{
list.erase(it1);
list.erase(it2);
it2 = list.begin();
it1 = it2++;
}
}
}
}
}
Dlaczego nie posortować listy i użyć 'std :: unique'? –
Jednym z ogólnych sposobów robienia tego, co byłoby lepsze, jest powtarzanie listy i przechowywanie każdego elementu w zestawie (jeśli jeszcze go tam nie ma), a następnie przekonwertowanie zestawu z powrotem na listę. To jest O (n) i nie modyfikuje listy podczas jej przechodzenia. Sugestia Kerrek jest dobra i prawdopodobnie istnieją inne sposoby, które są lepsze. –
Prawdopodobnie z powodu [debug iterators] (http://msdn.microsoft.com/en-us/library/aa985982 (VS.100) .aspx) i [sprawdzonych iteratorów] (http://msdn.microsoft.com/ en-us/library/aa985965 (VS.100) .aspx) jest domyślnie włączona w kompilacjach debugowania (plus, wiesz, wszystkie optymalizacje są wyłączone). Przejdź do linków, aby zobaczyć, jak je wyłączyć i zobaczyć, czy to pomaga. – ildjarn