сон (0)?последовательное сохранение времени в коде?

StackOverflow https://stackoverflow.com/questions/1851249

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

В настоящее время рекомендуемым интерфейсом для работы с высоким быстродействием в 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) легко возможен.

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

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

Другие советы

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

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

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

Конечно, помогают и большие наборы данных.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top