2012-09-27 15 views
8

estoy usando MSVC 2010.¿Por qué este código es 100 veces más lento en la depuración?

Estoy tratando de eliminar duplicados (sin mantener ninguna de ellas) de una lista

¿Por qué es este código 100 veces más lento en el modo de depuración?

¿Hay alguna otra manera de eliminar todos los objetos que son equivalentes y hacerlo más rápido en modo de depuración?

Es hasta el punto que no puedo usar la depuración en este momento. Tardar minutos en procesarse durante unos segundos en la versión.

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

¿Por qué no ordena la lista y utiliza 'std :: unique'? –

+4

Una forma general de hacer esto que sería mejor es repetir en la lista y almacenar cada elemento de un conjunto (si no está ya allí) sobre la marcha, luego convertir el conjunto a una lista. Eso es O (n) y no modifica la lista a medida que la atraviesa. La sugerencia de Kerrek es buena, y probablemente haya otras formas mejores. –

+1

Probablemente debido a [iteradores de depuración] (http://msdn.microsoft.com/en-us/library/aa985982 (VS.100) .aspx) y [iteradores marcados] (http://msdn.microsoft.com/ en-us/library/aa985965 (VS.100) .aspx) está habilitado de forma predeterminada en las compilaciones de depuración (además, ya sabes, todas las optimizaciones están desactivadas). Vaya a los enlaces para ver cómo desactivarlos y vea si eso ayuda. – ildjarn

Respuesta

14

En general, STL es muy lento durante la depuración en Visual Studio debido a la iterator debugging support. Puede acelerar esto drásticamente configurando _HAS_ITERATOR_DEBUGGING en 0.

+0

Traté de hacer que esto funcione durante bastante tiempo, pero sin éxito. Otras bibliotecas que utilizo prohíben cambiar _HAS_ITERATOR_DEBUGGING a 0 – Pat

+3

@Pat: siempre puede recurrir a la depuración comprobada 'printf()' en el modo de lanzamiento. Si es lo suficientemente bueno para los desarrolladores de kernel de Linux, ¡debería ser lo suficientemente bueno para cualquiera! Otra solución posible es cambiar la configuración de Release para que el proyecto se compile con las optimizaciones desactivadas y los símbolos activados. Luego depure la versión de lanzamiento. Se vinculará a bibliotecas que no sean de depuración, pero aún así podrá seguir su código perfectamente. Vuelva a configurar la optimización cuando termine. –

+0

si tiene la fuente para sus bibliotecas que utiliza, podría recompilar todas las que tienen _HAS_ITERATOR_DEBUGGING 0 eso es lo que terminé haciendo para impulsar y algunas otras ... –

Cuestiones relacionadas