Ho cercato di rintracciare perché ci vuole così tanto tempo per eseguire il debug del nostro programma in modalità di debug. Dopo aver usato xperf per vedere che aspetto avevano gli stack, era ovvio che stavamo spendendo un'enorme quantità di tempo nell'iteratore e nei container STL. Ho cercato su google questo per un po 'e ho trovato le opzioniPerché gli iteratori provocano un debugging molto lento in VS2010 anche con _HAS_ITERATOR_DEBUGGING, _SECURE_SCL, _SECURE_SCL_THROWS impostato su 0
_HAS_ITERATOR_DEBUGGING=0
_SECURE_SCL=0
_SECURE_SCL_THROWS=0
E ho impostato tutti quelli in codice con un #define
#define _HAS_ITERATOR_DEBUGGING 0
#define _SECURE_SCL 0
#define _SECURE_SCL_THROWS 0
ma questo non sembra funzionare, così poi ho provato con le definizioni del preprocessore all'interno del progetto di Visual Studio, ma che ancora non sembra aiutare.
Ho provato praticamente tutte le permutazioni a cui riesco a pensare, inclusa l'impostazione nelle intestazioni e, dopo tutto, gli include, ma non importa quello che faccio, non vedo un aumento delle prestazioni durante il debug. Per fare un esempio, quando si esegue in modalità di rilascio questa serie di operazioni richiede circa 140 secondi. In modalità di debug ci vogliono poco più di 2.400 secondi. Aumento di circa 17-18 volte del tempo di elaborazione.
Alcune informazioni aggiuntive, il processo che ospita queste dll C++ è un processo C# .net 4 e ho attivato il debug del codice non gestito. Fondamentalmente tutto il processo carica le DLL per noi. Tutto il vero lavoro è fatto nel codice C++.
Ho incluso la riga di comando completa del compilatore di seguito.
/I"..\CommonInclude" /Zi /nologo /W4 /WX /Od /Oy- /D "_CRT_SECURE_NO_WARNINGS" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_USRDLL" /D "ENGINE_EXPORTS" /D "_HAS_ITERATOR_DEBUGGING=0" /D "_SECURE_SCL=0" /D "_SECURE_SCL_THROWS=0" /D "_VC80_UPGRADE=0x0710" /D "_WINDLL" /D "_MBCS" /Gm- /EHa /MDd /GS /fp:precise /Zc:wchar_t- /Zc:forScope /GR /Yu"StdAfx.h" /Fp".\Debug/Foo.pch" /Fa".\Debug/" /Fo".\Debug/" /Fd".\Debug/" /Gd /analyze- /errorReport:queue /EHa -Zm350 /MP3
Tutte le idee perché questo sarebbe lento come è?
Si tratta di una build di debug; è pensato per il debug, non per le prestazioni. Ha lo scopo di garantire che il tuo codice funzioni. –
Iterator debug non è * che * lento. Non ottenere il codice ottimizzato è una causa più probabile. La soluzione è semplice, basta usare set di dati più piccoli per convalidare il codice. Le probabilità di scovare un bug con un numero di dati cento volte superiore non sono grandiose. –