Мне нужно использовать функцию логарифма в каком-то из моего кода, но база не имеет значения. Поэтому я решил выбрать между log()
, log2()
и log10()
по производительности, если обнаружил существенные отличия. (Я буду ссылаться на указанные функции как ln
, lb
и lg
соответственно).
Почему я суетился об этом? Потому что я буду вызывать функцию так часто, как 400 000 000 раз за итерацию алгоритма оптимизации. Это не факультативно, ни тема моего вопроса.
Я установил некоторые действительно базовые тесты, например:
timespec start, end;
double sum = 0, m;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
for (int n = 1; n < INT_MAX; ++n)
{
m = n * 10.1;
sum += log(m);
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
cout << "ln=";
cout << diff(start, end).tv_sec << ":" << diff(start, end).tv_nsec << endl;
... // likewise for log2 and log10
(timespec diff (timepec start, timepec end), если вы этого желаете....)
Были получены следующие результаты:
GCC v4.6.3
-O0
ln=140:516853107
lb=155:878100147
lg=173:534086352
-O1
ln=133:948317112
lb=144:78885393
lg=163:870021712
-O2
ln=9:108117039
lb=9:134447209
lg=4:87951676
-O3
ln=9:102016996
lb=9:204672042
lg=4:153153558
Я просмотрел вывод компиляции с помощью -S
, но у меня действительно нет достаточного сцепления с ассемблером, чтобы полностью понять различия. -S
вывод: - O0 -S, - O3 -S
Почему lg
лучше оптимизируется с O2/O3?
РЕДАКТИРОВАТЬ: Исходный код, обратите внимание на опечатку в третьем цикле, это причина того, что log10 выглядит быстрее (мульти-оптимизируется), Я принял ответ, который, я считаю, ближе всего, поскольку вопрос теперь закрыт, хотя я многому научился от ответов drhirsch и janneb.