Windows: Как рассчитать время, необходимое для запуска приложения c / c ++? - PullRequest
2 голосов
/ 21 января 2010

Я делаю тест сравнения производительности. Я хочу записать время выполнения моего тестового приложения на С ++ и сравнить его при разных обстоятельствах. Два сравниваемых случая: 1) драйвер файловой системы установлен и активен, и 2) также когда тот же драйвер файловой системы не установлен и не активен.

Серия тестов будет проведена на нескольких операционных системах, и два запуска, описанные выше, будут выполнены для каждой операционной системы и ее настройки. Результаты будут сравниваться только между двумя случаями для данной операционной системы и настройки.

Я понимаю, что при запуске приложения c / c ++ в операционной системе, которая не является системой реального времени, невозможно получить реальное время, необходимое для запуска приложения. Я не думаю, что это большая проблема, поскольку тестовое приложение работает в течение достаточно длительного периода времени, поэтому планирование, приоритеты, переключение и т. Д. Центрального процессора незначительны.

Отредактировано: только для платформы Windows Как я могу сгенерировать некоторые точные результаты выполнения приложения в моем тестовом приложении?

Ответы [ 8 ]

5 голосов
/ 21 января 2010

Если вы работаете в системе POSIX, вы можете использовать команду time, которая даст вам общее время "настенных часов", а также фактическое время ЦП (пользователь и система).

Редактировать: Очевидно, для систем Windows в Resource Kit , эквивалентном timeit.exe (не проверено), есть эквивалент для систем Windows.

2 голосов
/ 21 января 2010

Я думаю, что вы спрашиваете: «Как измерить время, необходимое для запуска процесса, независимо от« внешних »факторов, таких как другие программы, работающие в системе?» В этом случае проще всего было бы запустить программу несколько раз и получить среднее время. Таким образом, вы можете получить более значимое сравнение, надеясь, что различные случайные вещи, на которые ОС тратит время процессора, будут усреднены. Если вы хотите получить реальную фантазию, вы можете использовать статистический тест, такой как t-тест с двумя выборками, чтобы увидеть, действительно ли разница в ваших средних значениях времени значительна.

1 голос
/ 21 января 2010

Если вы работаете в системе Windows, вы можете использовать высокопроизводительные счетчики, вызывая QueryPerformanceCounter () :

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

int main()
{
    LARGE_INTEGER li = {0}, li2 = {0};
    QueryPerformanceFrequency(&li);
    __int64 freq = li.QuadPart;

    QueryPerformanceCounter(&li);
        // run your app here...
    QueryPerformanceCounter(&li2);

    __int64 ticks = li2.QuadPart-li.QuadPart;
    cout << "Reference Implementation Ran In " << ticks << " ticks" << " (" << format_elapsed((double)ticks/(double)freq) << ")" << endl;
    return 0;
}

... и, в качестве бонуса, вот функция, которая преобразует затраченное время (в секундах, с плавающей запятой) в описательную строку:

std::string format_elapsed(double d) 
{
    char buf[256] = {0};

    if( d < 0.00000001 )
    {
        // show in ps with 4 digits
        sprintf(buf, "%0.4f ps", d * 1000000000000.0);
    }
    else if( d < 0.00001 )
    {
        // show in ns
        sprintf(buf, "%0.0f ns", d * 1000000000.0);
    }
    else if( d < 0.001 )
    {
        // show in us
        sprintf(buf, "%0.0f us", d * 1000000.0);
    }
    else if( d < 0.1 )
    {
        // show in ms
        sprintf(buf, "%0.0f ms", d * 1000.0);
    }
    else if( d <= 60.0 )
    {
        // show in seconds
        sprintf(buf, "%0.2f s", d);
    }
    else if( d < 3600.0 )
    {
        // show in min:sec
        sprintf(buf, "%01.0f:%02.2f", floor(d/60.0), fmod(d,60.0));
    }
    // show in h:min:sec
    else 
        sprintf(buf, "%01.0f:%02.0f:%02.2f", floor(d/3600.0), floor(fmod(d,3600.0)/60.0), fmod(d,60.0));

    return buf;
}
1 голос
/ 21 января 2010

Вы можете поставить это

#if _DEBUG
time_t start = time(NULL);
#endif

и закончите с этим

#if _DEBUG
time end = time(NULL);
#endif

в вашем int main() методе. Естественно, вам придется вернуть разницу либо в журнал, либо в cout it.

1 голос
/ 21 января 2010

Просто чтобы расширить ответ ezod.
Вы запускаете программу с командой time, чтобы узнать общее время - в вашей программе нет изменений

0 голосов
/ 01 февраля 2011

Вы также можете использовать программу очень сонный , чтобы получить кучу информации о вашей программе во время выполнения. Вот ссылка: http://www.codersnotes.com/sleepy

0 голосов
/ 22 января 2010

QueryPerformanceCounter может иметь проблемы в многоядерных системах, поэтому я предпочитаю использовать timeGetTime (), который дает результат в миллисекундах

вам нужны 'timeBeginPeriod (1)' до и 'timeEndPeriod (1)' впоследствии, чтобы уменьшить степень детализации настолько, насколько вы можете, но я считаю, что она хорошо работает для моих целей (регулирование временных шагов в играх), так что это должно быть хорошо для бенчмаркинга.

0 голосов
/ 21 января 2010

Загрузите Cygwin и запустите вашу программу, передав ее в качестве аргумента команде time . Когда вы закончите, потратьте некоторое время на изучение остальных инструментов Unix, которые поставляются с Cygwin. Это будет одна из лучших инвестиций для вашей карьеры, которую вы когда-либо сделаете; набор инструментов Unix - вечная классика.

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