Программа работает медленнее при запуске вне Visual Studio
Я заметил странное поведение в отношении моей программы. Я пишу это на C ++ с использованием Visual Studio Professional 2013 Update 1, и оно состоит из приложения exe, которое связывается с несколькими библиотеками DLL и вызывает функции, определенные в этих библиотеках.
В моей основной программе (которая состоит из нескольких тысяч строк кода) я вызываю функцию DLL (давайте назовем ееDLLFunction()
) и я рассчитываю время, затраченное на этот вызов, например:
auto beginTime = std::chrono::high_resolution_clock::now();
DllFunction();
auto endTime = std::chrono::high_resolution_clock::now();
long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
Что я заметил, так это то, что при его запуске вне Visual Studio требуется гораздо больше времени. Например:
Запуск его вотлаживать в Visual Studio с подключенным отладчиком ->~50 ms
Запуск его врелиз в Visual Studioс отладчиком --->~25 ms
Запуск его врелиз в Visual Studioбез отладчика --->~20 ms
Запуск этовне Visual Studio (релиз построить) --->~80 ms
Как вы можете видеть, его запуск в выпуске вне Visual Studio на самом деле занимает больше времени, чем запуск отладочной сборки с отладчиком!
Неисправная DLL-библиотека создается в одном и том же решении одним и тем же компилятором, и я дважды проверил, что все библиотеки DLL в каталоге, откуда я запускаю приложение, являются правильными.
Что может быть причиной такого поведения?
РЕДАКТИРОВАТЬ 5: Основное приложение порождает другое консольное приложение и связывается с ним по именованным каналам. Выяснилось, что не порождая, что другое приложение делает вызов DLL быстрым вне Visual Studio.
Однако одно и то же приложение порождается как внутри, так и вне Visual Studio, поэтому я не понимаю, почему оно замедляет другие вызовы только вне Visual Studio.
РЕДАКТИРОВАТЬ 4Оказалось, что это медленное поведение появляется, только если я помещаю вызов функции в какую-то часть кода моей основной программы, поэтому это должно быть связано с этой проблемой. Это много строк, но я продолжу исследования.
В любом случае, спасибо за предложения, они были полезны для выявления проблемы.
РЕДАКТИРОВАТЬ 3: Измерения с помощью QueryPerfomanceCounter:
Циклы ЦП, измеренные в Visual Studio (~ 50 КБ), составляют половину циклов ЦП (~ 110 КБ) (кстати, возвращаются ли QueryPerfomanceCounter () фактическими циклами ЦП?).
Разделив его на частоту, вы получите результаты, аналогичные std :: chrono.
РЕДАКТИРОВАТЬ 2: Я проверил с помощью Process Explorer, как предложено, библиотеки DLL, загруженные в VS и вне VS идентичны.
РЕДАКТИРОВАТЬ 1: по запросу я попробовал это:
auto beginTime = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 1000; ++i)
{
DllFunction();
}
auto endTime = std::chrono::high_resolution_clock::now();
long long totalTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count();
И результаты: запуск его врелиз в Visual Studioс отладчиком --->~19 seconds
Запуск этовне Visual Studio (релиз построить) --->~40 seconds