J'ai besoin d'utiliser une fonction logarithme dans certains de mon code, mais la base n'a pas d'importance. Donc je me mis à le choix entre log()
, log2()
, et log10()
de la performance, à condition que j'ai trouvé de différences significatives. (Je vais me référer à ces fonctions en tant que ln
, lb
, et lg
respectivement).
Pourquoi suis-je de plaisanter à ce sujet? Parce que je vais être l'appel de la fonction, aussi souvent que les crédits de 400 000 000 de fois par itération d'un algorithme d'optimisation. Ce n'est ni option ni le sujet de ma question.
J'ai mis en place certaines vraiment des tests de base, comme suit:
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(timespec démarrer, timespec fin) si vous le désirez....)
Les résultats suivants ont été obtenus:
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
J'ai regardé à la sortie de la compilation avec -S
, mais je n'ai pas une assez bonne emprise sur l'assembleur pour comprendre pleinement les différences. -S
sortie de: -O0 -S, -O3-S
Pourquoi est - lg
optimiser mieux avec O2/O3?
EDIT: le code Source, remarque la faute de frappe dans la troisième boucle, c'est la cause de log10 apparente plus rapide (mult. obtenir optimisé out). J'ai accepté la réponse, je crois, est la plus proche, puisque la question a été fermée, mais j'ai beaucoup appris de drhirsch et janneb réponses.