сон (0)? последовательное хранение времени в коде? - PullRequest
2 голосов
/ 05 декабря 2009

Сейчас я загружаю файл, затем использую gettimeofday и отслеживаю время процессора с помощью tv_usec

Мои результаты меняются, я получаю от 250 до 280, но иногда 300 или 500. Я написал usleep и sleep (0) и (1) безуспешно. Время все еще сильно различается. Я думал, что сон (1) (секунды в Linux, а не Windows Sleep в MS) решил бы это. Как я могу более точно отслеживать время для тестирования? Может быть, я должен подождать, пока у меня не появятся гораздо большие тестовые данные и более сложный код, прежде чем начинать измерения?

Ответы [ 3 ]

4 голосов
/ 05 декабря 2009

В настоящее время рекомендуемый интерфейс для high-rez времени в Linux (и POSIX в целом) - clock_gettime. Смотрите справочную страницу.


clock_gettime(CLOCK_REALTIME, struct timespec *tp) //  for wall-clock time
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, struct timespec *tp) //  for CPU time

Но прочитайте справочную страницу. Обратите внимание, что вам нужно связать с -lrt, потому что POSIX говорит так, я думаю. Может быть, чтобы избежать конфликтов символов в -lc, для старых программ, которые определяли свое собственное clock_gettime? Но динамические библиотеки используют слабые символы ...

Лучшая функция сна - это нано-сон. Это не возиться с сигналами или любой ерундой, как usleep. Это определено, чтобы просто спать, и не иметь никаких других побочных эффектов. И он сообщает вам, если вы проснулись рано (например, от сигналов), поэтому вам не обязательно вызывать другую функцию времени.

В любом случае, вам будет сложно протестировать одну повторение чего-то такого короткого, что включает системный вызов. Существует огромное количество возможностей для вариаций. например планировщик может решить, что нужно выполнить какую-то другую работу (маловероятно, если ваш процесс только начался; вы еще не использовали свой временной интервал). Кэш процессора (L2 и TLB) легко возможен.

Если у вас есть многоядерный компьютер и однопоточный тест для кода, который вы оптимизируете, вы можете дать ему приоритет в реальном времени, закрепленный за одним из ваших ядер. Убедитесь, что вы выбрали ядро, которое не обрабатывает прерывания, иначе ваша клавиатура (и все остальное) будет заблокирована, пока не будет сделано. Используйте набор задач (для закрепления на одном процессоре) и chrt (для настройки prio в реальном времени). Посмотрите это письмо, которое я отправил в gmp-devel с этим трюком: http://gmplib.org/list-archives/gmp-devel/2008-March/000789.html

О, да, для наиболее точной синхронизации вы можете использовать rdtsc самостоятельно (на x86 / amd64). Если у вас нет других системных вызовов в том, что вы жмете, это неплохая идея. Возьмите систему сравнительного анализа, чтобы реализовать свою функцию. У GMP довольно приличный. Возможно, он плохо настроен для функций бенчмаркинга, которых нет в GMP и которые называются mpn_whwhat. Я не помню, и это стоит посмотреть.

2 голосов
/ 05 декабря 2009

Вы пытаетесь измерить, сколько времени занимает загрузка файла? Обычно, если вы тестируете производительность некоторого фрагмента кода, который уже довольно быстрый (менее секунды), то вы захотите повторить один и тот же код несколько раз (скажем, тысяча или миллион), время всего лота, а затем разделите общее время на количество итераций.

Сказав это, я не совсем уверен, для чего вы используете sleep (). Можете ли вы опубликовать пример того, что вы собираетесь делать?

1 голос
/ 05 декабря 2009

Я бы рекомендовал поместить этот код в цикл for. Запустите его на 1000 или 10000 итераций. Есть проблемы с этим, если вы делаете только несколько инструкций, но это должно помочь.

Большие наборы данных также помогают.

сон собирается удалить вашу ветку из процессора. Он не точно рассчитывает время с точностью.

...