2012-09-27 20 views
8

Sto usando MSVC 2010.Perché questo codice è 100 volte più lento nel debug?

Sto cercando di rimuovere duplicati (senza tenere uno di essi) da un elenco

Perché questo codice 100 volte più lento in modalità debug?

C'è un altro modo per rimuovere tutti gli oggetti equivalenti e renderlo più veloce in modalità di debug?

È al punto che non posso usare il debug al momento. Ci vogliono minuti per elaborare mentre pochi secondi in rilascio.

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

Perché non ordinare l'elenco e utilizzare 'std :: unique'? –

+4

Un modo generale per farlo sarebbe meglio iterare attraverso l'elenco e memorizzare ogni elemento in un set (se non è già lì) mentre vai, quindi convertire il set in un elenco. Quello è O (n) e non modifica l'elenco mentre lo stai attraversando. Il suggerimento di Kerrek è buono e probabilmente ci sono altri modi migliori. –

+1

Probabilmente a causa di [debug iterators] (http://msdn.microsoft.com/en-us/library/aa985982 (VS.100) .aspx) e [iteratori controllati] (http://msdn.microsoft.com/ en-us/library/aa985965 (VS.100) .aspx) abilitato di default nei build di debug (in più, si sa, l'intera ottimizzazione è disabilitata). Vai ai link per vedere come disabilitarli e vedere se questo aiuta. – ildjarn

risposta

14

In generale, STL è molto lento durante il debug in Visual Studio causa della iterator debugging support. Puoi accelerare drasticamente il problema impostando _HAS_ITERATOR_DEBUGGING su 0.

+0

Ho provato a farlo funzionare per un po 'di tempo, ma senza successo. Altre librerie che uso proibiscono di cambiare _HAS_ITERATOR_DEBUGGING a 0 – Pat

+3

@Pat: È sempre possibile ricorrere al debug 'printf()' provato e true in modalità di rilascio. Se è abbastanza buono per gli sviluppatori del kernel di Linux, dovrebbe essere abbastanza buono per chiunque! Un'altra possibile soluzione consiste nel modificare la configurazione di Release per il progetto da compilare con le ottimizzazioni disattivate e i simboli su. Quindi eseguire il debug della versione di rilascio. Si collegherà alle librerie non di debug, ma dovresti comunque essere in grado di scorrere il tuo codice bene. Imposta di nuovo l'ottimizzazione quando hai finito. –

+0

se hai il sorgente delle tue librerie che usi, potresti ricompilare tutti quelli con _HAS_ITERATOR_DEBUGGING 0 è quello che ho finito per fare il boost e altri ... –

Problemi correlati