Okay, ich war also an Bord und fragte mich, wie schnell math.h square Root im Vergleich zu der mit der magischen Zahl darin war (berühmt geworden durch Quake, aber von SGI gemacht).
Aber das hat mich in eine Welt des Schmerzes geführt.
Ich habe das zuerst auf dem Mac ausprobiert, wo die math.h jedes Mal gewonnen hat, und dann auf Windows, wo die magische Zahl immer gewonnen hat, aber ich denke, das ist alles auf meine eigene Unwissenheit zurückzuführen.
-
Kompilieren auf dem Mac mit "g++ -o sq_root sq_root_test.cpp", wenn das Programm ausgeführt wird, dauert es etwa 15 Sekunden zu beenden. Aber das Kompilieren in VS2005 auf Release dauert einen Sekundenbruchteil. (Tatsächlich musste ich das Programm im Debug-Modus kompilieren, nur damit es ein paar Zahlen anzeigt)
-
Mein armes Benchmarking? ist das wirklich dumm? denn ich erhalte 0,01 für math.h und 0 für die Magic number. (es kann nicht so schnell sein, kann es?)
Ich weiß nicht, ob das eine Rolle spielt, aber der Mac hat einen Intel-Prozessor und der PC einen AMD-Prozessor. Verwendet der Mac Hardware für math.h sqroot?
Ich habe den schnellen Quadratwurzel-Algorithmus von http://en.wikipedia.org/wiki/Fast_inverse_square_root
//sq_root_test.cpp
#include <iostream>
#include <math.h>
#include <ctime>
float invSqrt(float x)
{
union {
float f;
int i;
} tmp;
tmp.f = x;
tmp.i = 0x5f3759df - (tmp.i >> 1);
float y = tmp.f;
return y * (1.5f - 0.5f * x * y * y);
}
int main() {
std::clock_t start;// = std::clock();
std::clock_t end;
float rootMe;
int iterations = 999999999;
// ---
rootMe = 2.0f;
start = std::clock();
std::cout << "Math.h SqRoot: ";
for (int m = 0; m < iterations; m++) {
(float)(1.0/sqrt(rootMe));
rootMe++;
}
end = std::clock();
std::cout << (difftime(end, start)) << std::endl;
// ---
std::cout << "Quake SqRoot: ";
rootMe = 2.0f;
start = std::clock();
for (int q = 0; q < iterations; q++) {
invSqrt(rootMe);
rootMe++;
}
end = std::clock();
std::cout << (difftime(end, start)) << std::endl;
}