Время выполнения программ в Visual C ++ - PullRequest
1 голос
/ 22 октября 2009

Существует ли быстрый и простой способ синхронизации раздела программы (или всего этого) без необходимости установки класса таймера, функций и переменных внутри самой моей программы?

Я имею в виду Visual C ++ (Professional 2008).

Спасибо,

-Faken

Редактировать: ни один из этих ответов не выполняет то, о чем я прошу, я хотел бы иметь возможность рассчитать время выполнения программы в Visual C ++, БЕЗ необходимости писать в ней дополнительные биты кода. Подобно тому, как люди делают это с BASH в Linux.

Ответы [ 5 ]

3 голосов
/ 29 октября 2009

Visual Studio имеет профилировщик , но вам может потребоваться более высокий SKU, чем Pro (например, Team System Development Edition). Я не уверен, что профилировщик делает фактические сроки. Из связанной статьи выглядит так, как будто она может просто выполнять выборку, которая может сказать вам, какие функции занимают больше всего времени.

Еще во времена VC6 существовали инструменты командной строки для профилирования (PREP, PROFILE и PREPORT). Те могли сделать выбор времени так же как выборку. Создание лучшего профилировщика - это замечательно, но ограничение его на SKU стоимостью в несколько тысяч долларов не позволяет мелким независимым разработчикам ПО и любителям выйти из игры.

3 голосов
/ 22 октября 2009

timeGetTime показывает количество миллисекунд, прошедших с момента включения машины. Рассчитав разницу между результатами этой функции до и после вашей операции, вы получите количество миллисекунд, которое потребовалось. Не забудьте связать с winmm.lib

EDIT:

DWORD msBegin = timeGetTime();
// do your stuff here
DWORD msDuration = timeGetTime() - msBegin;
// at this moment msDuration contains number of milliseconds it took for your stuff to execute

Предостережения:

  1. разрешение этого таймера обычно составляет 10 мсек. Есть способы изменить его, но он достаточно точен для большинства сценариев
  2. если у вас несколько процессоров, результаты, возвращаемые этой функцией, выполняемые на разных процессорах, могут быть несовместимыми
2 голосов
/ 01 ноября 2009

Если вы хотите синхронизировать разделы вашей программы без изменения кода, тогда вам нужно получить профилировщик.

Visual Studio Team System (или Premium в VS2010) имеет профилировщик, но он недоступен в Professional. Другими популярными вариантами являются AQTime (с 30-дневной пробной версией) и ANTS-профилировщик Redgate (с двухнедельной пробной версией).

Вы также можете посмотреть предложения в этом вопросе о бесплатных опциях, которые рекомендуют Sleepy и CodeAnalyst AMD для Windows .

2 голосов
/ 30 октября 2009

Этот ответ на сайте superuser.com предлагает Timethis.exe из Windows 2000 Resource Kit Tool (точно так же, как время для систем Unix). Пример использования :

...

Программы запускались с этими команды:

timethis "perf.exe    tt > NUL"
timethis "perfgcc.exe tt > NUL"

Время (с файлом, имеющим 100 строки, каждая строка содержит 250000 целые числа более или менее случайно распределяется между 1 и 250000) были:

VS компилятор:

  • 7,359
  • 7,359
  • 7,296

НКА:

  • 1,906
  • 1,906
  • 1,937

...

Так что Visual Studio вообще не участвует.

Другая такая маленькая утилита - ptime .

2 голосов
/ 29 октября 2009

В процессорах Intel и AMD есть высокоскоростной счетчик. Windows API включает в себя вызовы функций для считывания значения этого счетчика, а также частоты счетчика, т. Е. Сколько раз в секунду он рассчитывает.

Вот пример того, как рассчитать время в микросекундах:


#include <iostream>
#include <windows.h>

int main()
{
        __int64 ctr1 = 0, ctr2 = 0, freq = 0;

        // Start timing the code.

        if (QueryPerformanceCounter((LARGE_INTEGER *) &ctr1) != 0) {
                // Do what ever you do, what ever you need to time...
                //
                //
                //

                // Finish timing the code.

                QueryPerformanceCounter((LARGE_INTEGER *) &ctr2);
                QueryPerformanceFrequency((LARGE_INTEGER *) &freq);

                // Print the time spent in microseconds to the console.

                std::cout << ((ctr2 - ctr1) * 1.0 / freq) << std::endl;
        }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...