Вы должны рассмотреть возможность использования CLOCK_MONOTONIC
для этого измерения - оно имеет значительно меньшие накладные расходы, чем получение CLOCK_REALTIME
.Для измерения производительности (нам нужна точность в наносекунды) я использую счетчик RDTSC:
С GCC 4.4+ (в этом нет уверенности на 100%, 4.6.1 это точно реализует) в системе Intel, которую вы можете использовать:
#include <x86intrin.h>
uint64_t clock_count = __rdtsc();
или, если нет:
extern "C" {
__inline__ uint64_t rdtsc()
{
uint32_t lo, hi;
__asm__ __volatile__ (
"xorl %%eax,%%eax \n cpuid"
::: "%rax", "%rbx", "%rcx", "%rdx");
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}
}
, то деление дельты тактовых импульсов на частоту вашего процессора на число герц частоты процессора даст вам очень точное измерение на долю отстоимость clock_gettime()
Редактировать:
И чтобы ответить на актуальный вопрос сейчас:)
В вашем коде вы фактически измеряете 2 вещи - создание сообщения иотправив это.Вы можете измерить их отдельно или переместить сбор данных за пределы блока.Запись данных обходится дорого, когда вы измеряете микросекунды.
Я думаю, что проблема в сочетании snprintf () и отсутствия кэша.Функции форматирования имеют очень низкую производительность, и, поскольку вы каждый раз перестраиваете данные, существует вероятность того, что время от времени вы пропускаете кэш , что должно ответить на вопрос об изменчивости.