Ich mache einige leistungskritische Arbeiten in C ++ und wir verwenden derzeit ganzzahlige Berechnungen für Probleme, die von Natur aus Gleitkommawerte sind, weil "es schneller ist". Dies verursacht eine Menge nerviger Probleme und fügt viel nervigen Code hinzu.
Jetzt erinnere ich mich, dass ich gelesen habe, wie langsam Gleitkommaberechnungen ungefähr in den 386 Tagen waren, in denen es meines Erachtens (IIRC) einen optionalen Co-Prozessor gab. Aber heutzutage macht es bei exponentiell komplexeren und leistungsfähigeren CPUs sicherlich keinen Unterschied in der "Geschwindigkeit", wenn Gleitkomma- oder Ganzzahlberechnungen durchgeführt werden? Zumal die tatsächliche Berechnungszeit im Vergleich zu einem Pipeline-Stillstand oder dem Abrufen von Daten aus dem Hauptspeicher winzig ist?
Ich weiß, dass die richtige Antwort darin besteht, die Zielhardware zu bewerten. Was wäre ein guter Weg, um dies zu testen? Ich habe zwei winzige C ++ - Programme geschrieben und ihre Laufzeit mit "time" unter Linux verglichen, aber die tatsächliche Laufzeit ist zu variabel (hilft nicht, dass ich auf einem virtuellen Server ausgeführt werde). Kann ich nicht meinen ganzen Tag damit verbringen, Hunderte von Benchmarks durchzuführen, Diagramme zu erstellen usw. Kann ich etwas tun, um einen vernünftigen Test der relativen Geschwindigkeit zu erhalten? Irgendwelche Ideen oder Gedanken? Bin ich völlig falsch
Die Programme, die ich wie folgt verwendet habe, sind keineswegs identisch:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
int accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += rand( ) % 365;
}
std::cout << accum << std::endl;
return 0;
}
Programm 2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
float accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += (float)( rand( ) % 365 );
}
std::cout << accum << std::endl;
return 0;
}
Danke im Voraus!
Bearbeiten: Die Plattform, die mir wichtig ist, ist reguläres x86 oder x86-64, das auf Desktop-Linux- und Windows-Computern ausgeführt wird.
Bearbeiten 2 (eingefügt aus einem Kommentar unten): Wir haben derzeit eine umfangreiche Codebasis. Ich bin wirklich auf die Verallgemeinerung gestoßen, dass wir "kein Float verwenden dürfen, da die Ganzzahlberechnung schneller ist" - und ich suche nach einer Möglichkeit (wenn dies überhaupt zutrifft), diese verallgemeinerte Annahme zu widerlegen. Mir ist klar, dass es unmöglich sein würde, das genaue Ergebnis für uns vorherzusagen, wenn wir nicht die ganze Arbeit erledigen und sie anschließend profilieren würden.
Trotzdem vielen Dank für all Ihre hervorragenden Antworten und Ihre Hilfe. Fühlen Sie sich frei, etwas anderes hinzuzufügen :).
float
den Geschwindigkeitsschub erhält, dies aber normalerweise double
nicht tut.
addl
ersetzt durchfadd
zum Beispiel). Der einzige Weg, um wirklich eine gute Messung zu erhalten, besteht darin, einen Kernbestandteil Ihres realen Programms zu erhalten und verschiedene Versionen davon zu profilieren. Leider kann das ohne großen Aufwand ziemlich schwierig sein. Wenn Sie uns die Zielhardware und Ihren Compilerfixed_point
mitteilen, können die Benutzer Ihnen möglicherweise zumindest bereits vorhandene Erfahrungen usw. vermitteln. Ich vermute, Sie könnten eine Art Vorlagenklasse erstellen, die diese Arbeit erheblich erleichtert.