2012-05-21 9 views
7
struct test_struct 
{ 
    test_struct() {} 
    ~test_struct() {} 
}; 

#include <vector> 
#include <memory> 
#include <cstdio> 

int main() 
{ 
    printf("ctor begin\n"); 
    { 
     std::vector<std::unique_ptr<test_struct>> test_vec; 
     const int count = 100000; 

     for (auto i = 0; i < count; i++) { 
      test_vec.emplace_back(new test_struct); 
     } 
     printf("dtor begin\n"); 
    } 
    printf("dtor end\n"); 
} 

Estoy usando VS2010 y he encontrado un problema de rendimiento ridículo. El código anterior funciona bien tanto en depuración como en compilación de versión (ctrl + f5), pero cuando se adjunta depurador (f5), la llamada dtor para la clase unique_ptr es intolerablemente lenta. El código máquina de resultados está bastante optimizado, así que no espero que sea un problema de compilación en lugar de depurador, pero no sé cómo manejarlo. Mi pregunta esRidículamente lenta llamada unique_ptr dtor cuando se adjunta depurador (msvc)

  • ¿Se puede reproducir este problema en su máquina?
  • ¿Cuál es la razón de este comportamiento?
  • ¿Hay alguna solución?
+0

Pruebe a enjuagar después de cada printf. – Pubby

+0

@Pubby: Eso no marcará la diferencia, solo hay 3 'printf's en total, no uno por cada iteración de bucle. –

+0

Pude reproducir esto en mi edición expresa VS2010. – RedX

Respuesta

6

La ralentización es causada por la comprobación de la memoria que se produce cada vez que se libera la memoria. Sin embargo, este es un montón de nivel de sistema/depurador especial, y no es algo que pueda controlar desde dentro de su programa.

Hay un great article on the issue. Para resumir: ¡tiene que establecer una variable de entorno para deshabilitarla!

Afortunadamente, puede establecer variables de entorno específicas del proyecto desde las opciones de depuración en la configuración del proyecto para su proyecto, de modo que la variable de entorno solo se aplique a su programa.

que utilizan este programa simplificado para la prueba:

#include <iostream> 
#include <memory> 
#include <vector> 

int main() 
{ 
    std::cout << "ctor begin" << std::endl; 
    { 
     std::vector<std::unique_ptr<int>> test_vec; 

     for (unsigned i = 0; i < 100000; i++) 
      test_vec.emplace_back(new int); 

     std::cout << "dtor begin" << std::endl; 
    } 
    std::cout << "dtor end" << std::endl; 
} 

Al establecer _NO_DEBUG_HEAP=1 como una variable de entorno (ya sea de todo el sistema, que no voy a recomendar, oa través de las opciones de depuración), el código se ejecuta en aproximadamente la misma cantidad de tiempo, independientemente de si el depurador está conectado o no.

Cuestiones relacionadas