Измерьте время выполнения в C (в Windows)

Есть ли лучшая функция или способ измерения времени, чем функция clock() в Windows? У меня короткая операция, и когда я пытаюсь clock() или gettickcount(), он говорит, что это заняло 0,0 секунды. Мне нужен способ измерить его миллисекундами или наносекундами.


person Bar    schedule 30.03.2013    source источник


Ответы (2)


Вы можете использовать QueryPerformanceCounter и QueryPerformanceFrequency :

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void)
{
    LARGE_INTEGER frequency;
    LARGE_INTEGER start;
    LARGE_INTEGER end;
    double interval;

    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&start);

    // code to be measured

    QueryPerformanceCounter(&end);
    interval = (double) (end.QuadPart - start.QuadPart) / frequency.QuadPart;

    printf("%f\n", interval);

    return 0;
}
person masoud    schedule 30.03.2013
comment
Спасибо. Вы очень помогли. - person Bar; 30.03.2013
comment
Это работало с кодом последовательного поиска. Но это дает программе остановку работы с ошибкой, когда я использую ее с кодом двоичного поиска. В чем может быть проблема? - person Bar; 30.03.2013
comment
Приведенный выше код проверен, если у вас есть проблема, она где-то еще. Отладьте свой двоичный поиск... или задайте свою проблему как новый вопрос StackOverflow. - person masoud; 30.03.2013
comment
interval должно быть в секундах (согласно этому ответу и документация QueryPerformanceFrequency) - person pcworld; 02.12.2016
comment
Обратите внимание, что частота может быть равна 0, если аппаратное обеспечение не поддерживает ее. Так что, вероятно, лучше добавить проверку, что это не 0, - person Tal Jerome; 20.04.2020
comment
В MSVC я понимаю, что clock() дает время стены, а не время выполнения. Я попробовал этот метод QPC в надежде получить стабильные тайминги (для профилирования), но, к сожалению, измеренное время здесь тоже различается. Это для периодов в 1 секунду или более и для операций, которые абсолютно одинаковы при каждом запуске, поэтому он не может измерять время выполнения. Так что мне еще предстоит сделать несколько заездов и зафиксировать кратчайшее время. - person Weather Vane; 08.08.2020

Вы можете использовать QueryPerformanceCounter в сочетании с QueryPerformanceFrequency чтобы получить наносекундную точность.

person Community    schedule 30.03.2013