POSIX Clocks
Я написал эталон для источников тактовых импульсов POSIX:
- время (с) => 3 цикла
- ftime (мс) => 54циклы
- gettimeofday (us) => 42 цикла
- clock_gettime (нс) => 9 циклов (CLOCK_MONOTONIC_COARSE)
- clock_gettime (нс) => 9 циклов (CLOCK_REALTIME_COARSE)
- clock_gettime (нс) => 42 цикла (CLOCK_MONOTONIC)
- clock_gettime (нс) => 42 цикла (CLOCK_REALTIME)
- clock_gettime (нс) => 173 цикла (CLOCK_MONOTONIC_RAW)
- clock_gettime (нс) => 179 циклов (CLOCK_BOOTTIME)
- clock_gettime (нс) => 349 циклов (CLOCK_THREAD_CPUTIME_ID)
- clock_gettime (нс) => 370 циклов (CLOCK_PE_CROC)
- rdtsc (циклы) => 24 цикла
Эти цифры взяты из процессора Intel Core i7-4771 @ 3,50 ГГц в Linux 4.0.Эти измерения были выполнены с использованием регистра TSC и запуска каждого тактового метода тысячи раз и с минимальным значением стоимости.
Вы захотите провести тестирование на машинах, на которых вы собираетесь работать, хотя и то, как они реализованы, различается.от аппаратного обеспечения и версии ядра.Код можно найти здесь .Для подсчета циклов используется регистр TSC, который находится в том же репо ( tsc.h ).
TSC
Доступ к TSC (счетчик меток времени процессора)) самый точный и дешевый способ оценивать вещи.Как правило, это то, что ядро использует само.Это также довольно просто на современных чипах Intel, поскольку TSC синхронизируется между ядрами и не зависит от масштабирования частоты.Таким образом, он обеспечивает простой, глобальный источник времени.Вы можете увидеть пример его использования здесь с пошаговым описанием кода сборки здесь .
Основная проблема с этим (кроме переносимости) заключается в том, чтоне кажется хорошим способом перехода от циклов к наносекундам.Документы Intel, насколько я могу найти, утверждают, что TSC работает на фиксированной частоте, но эта частота может отличаться от заявленной частоты процессоров.Похоже, Intel не предоставляет надежного способа выяснить частоту TSC.Ядро Linux, похоже, решает эту проблему, проверяя, сколько циклов TSC происходит между двумя аппаратными таймерами (см. здесь ).
Memcached
Memcached не выполняет метод кэширования.Это может быть просто для того, чтобы обеспечить более предсказуемую производительность на разных платформах или улучшить масштабирование с использованием нескольких ядер.Это также может быть бесполезной оптимизацией.