легкий таймер в C - PullRequest
       2

легкий таймер в C

0 голосов
/ 31 марта 2011

Я ищу легкий таймер для измерения времени нескольких разделов кода C. Эта реализация таймера не должна увеличивать общее время выполнения программы.

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Посмотрите на clock_gettime для POSIX-совместимых платформ;Вы можете сделать это сами очень легко, сравнив одну временную метку с сгенерированной немного позже.

Не забудьте использовать параметры CLOCK_PROCESS_CPUTIME_ID или CLOCK_THREAD_CPUTIME_ID, чтобы указать, что вы хотите, чтобы процессорное время было взято только на process (и его дочерние элементы) или нить, а не более широкое абсолютное "настенное" время.

альтернатива в Windows может быть GetProcessTimes.

2 голосов
/ 31 марта 2011

Сколько времени?

Представьте, что ваш код занял 3 миллисекунды ... но он работает на 3 ядрах ... он использовал 2 миллисекунды на ядре 1;1,5 миллисекунды на сердечнике 2;и 1,2 миллисекунды на ядре 3 в общей сложности 4,7 миллисекунды.

Итак ... 3 миллисекунды - это 4,7 миллисекунды?

О, не забывайте, что эти 4,7 миллисекундыФакт также используется для фильтрации входящих подключений к Интернету и загрузки антивирусных баз.

Используйте профилировщик , и даже в этом случае не доверяйте результатам:)


Для POSIX попробуйте gettimeofday() (устарел) clock_gettime().
Для Windows, по-видимому, выможно использовать GetSystemTime().

0 голосов
/ 31 марта 2011

Самая близкая вещь к профилированию без вмешательства наблюдателя - oprofile. Но он не может напрямую измерять интервалы; он только дает вам статистическую карту того, где вся программа (или вся система) тратит свое время.

Если вам действительно нужен дешевый интервал, на x86 вы можете использовать инструкцию rdtsc во встроенном asm.

static inline unsigned rdtsc()
{
    unsigned x;
    __asm__ __volatile__ ( "rdtsc" : "=a"(x) : : "edx" );
    return x;
}

Используйте это, чтобы сохранить метку времени до и после и принять разницу. Вы можете изменить этот код, чтобы сохранить полный 64-битный результат, но я выбрал только 32-битный результат, предполагая, что вы будете использовать временные интервалы короче 4 миллиардов циклов и не хотите тратить время на 64-битное вычитание.

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