Как можно измерить время для большого блока кода, кроме случаев, когда он остановлен на точке останова?

Я работаю над C ++ игрой / симуляцией / графическим приложением для Windows.
(редактировать начало) Если это имеет значение, я использую Visual Studio 2013. (редактировать конец)

Настроить: Я измеряю время от одного кадра к следующему, используя QueryPerformanceCounter ().

Действия по воспроизведению:
Остановитесь на точке останова для некоторой отладки.

Текущий нежелательный результат: Когда приложение возобновит выполнение, при следующем вызове QueryPerformanceCounter () оно вернет значение времени, которое включает все время, проведенное в режиме отладки в отладчике. Это приводит к аномально большой длительности кадра.

Желаемый результат: QueryPerformanceCounter () вернет значение времени, которое не включает столько времени, сколько я потратил на паузу в точке останова для отладки.

Как мне достичь желаемого результата?
1. Есть ли другая функция, которую я должен использовать вместо QueryPerformanceCounter?
2. Есть ли какие-то настройки в IDE (т.е. Visual Studio), которые можно изменить?
3. Есть ли какой-то особый способ использовать QueryPerformanceCounter или другой
функция времени?
4. и т. Д.

Справочные заметки: Здесь есть несколько схожий вопрос, но мне не помогло найти решение. Время отслеживания в отладчике

2

Решение

Я не уверен, что понимаю, что вы пытаетесь сделать.

  • Измерение длительности в режиме отладки бесполезно. Различия между Debug и Release очень существенны. Соотношение между разными временами выполнения разных функций не обязательно одинаково в Debug и Release.
  • Если вам нужно устранить узкие места, используйте профилировщик (в VC перейдите к Debug | Profiler).

Если вы все еще хотите измерить время в режиме отладки, вот вам идея:

#include <iostream>
#include <chrono>
#include <Windows.h>

struct duration
{
std::chrono::high_resolution_clock::time_point _s;

duration() : _s( std::chrono::high_resolution_clock::now() )
{
// nop
}

auto ms()
{
return std::chrono::duration<double, std::milli>( std::chrono::high_resolution_clock::now() - _s ).count();
}
};

struct breakpoint
{
std::chrono::high_resolution_clock::time_point _s;
duration& _d;

breakpoint( duration& a_d ) : _s( std::chrono::high_resolution_clock::now() ), _d( a_d )
{
__asm {int 3}
}

~breakpoint()
{
_d._s += std::chrono::high_resolution_clock::now() - _s;
}
};

int main()
{
duration d;

Sleep( 1000 );
std::cout << d.ms() << std::endl;

breakpoint { d };

Sleep( 1000 );
std::cout << d.ms() << std::endl;

return 0;
}
2

Другие решения

Используйте коммерческий инструмент профилирования. Измерение того, сколько времени потребовалось для выполнения функции или метода, — это именно то, для чего они созданы.

Кроме того, почему вас волнует, сколько времени что-то заняло во время отладки? Планируете ли вы выпускать для своих клиентов в режиме отладки и обходить их построчно, пока они играют? Если вы хотите проверить время кадра, проверьте его в выпуске с включенной оптимизацией.

2

По вопросам рекламы [email protected]