2012-09-27 10 views
8

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++; 
       } 
      } 
     } 
    } 
} 
+1

Dlaczego nie posortować listy i użyć 'std :: unique'? –

+4

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. –

+1

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

Odpowiedz

14

Ogólnie STL jest bardzo powolny podczas debugowania w Visual Studio dzięki iterator debugging support. Możesz znacznie przyspieszyć, ustawiając _HAS_ITERATOR_DEBUGGING na 0.

+0

Próbowałem zrobić to przez jakiś czas, ale bez powodzenia. Inne biblioteki, których używam, zabraniają zmieniania _HAS_ITERATOR_DEBUGGING na 0 – Pat

+3

@Pat: Zawsze możesz wrócić do wypróbowanego i prawdziwego 'printf()' debugowania w trybie zwolnienia. Jeśli jest wystarczająco dobre dla programistów jądra Linux, to powinno być wystarczająco dobre dla każdego! Innym możliwym rozwiązaniem jest zmiana konfiguracji Release dla projektu na kompilację z wyłączonymi optymalizacjami i symbolami. Następnie debuguj kompilację Release. Połączy się z bibliotekami, które nie debugują, ale powinieneś być w stanie przejrzeć swój kod. Po zakończeniu ustaw optymalizację. –

+0

jeśli masz źródło do bibliotek, których używasz, możesz przekompilować je wszystkimi za pomocą _HAS_ITERATOR_DEBUGGING 0, to właśnie zrobiłem dla wzmocnienia, i kilka innych ... –

Powiązane problemy