Ich verwende C++, um einen komplizierten FFT-Algorithmus zu codieren, also muss ich solche algebraischen Strukturen wie Quaternionen und Hamilton-Eisenstein-Codes implementieren. Der Algorithmus arbeitet mit einem 2D-Array dieser Strukturen. Was wäre der Overhead, wenn ich sie als Klassen implementiere? Sollte ich das Array mit [M][N] Dimensionen erstellen, das aus Quaternion-Klassen besteht, oder sollte ich ein [M][N][4] Array erstellen und mit [4] Arrays als Quaternionen arbeiten? Klassen zu verwenden ist bequemer, aber M*N Klassen zu erstellen und auf ihre Methoden zuzugreifen, anstatt nur mit dem Array zu arbeiten - wäre das nicht zu viel Overhead? Ich programmiere den Algorithmus für die Verarbeitung großer Bilder, daher ist die Leistung für mich wichtig.
Antworten
Zu viele Anzeigen?Meiner Meinung nach sind Sie besser dran, sie als Klassen zu implementieren, einfach weil Sie damit Ihren Code schneller und mit weniger Fehlern schreiben können. Sie sollten Messungen durchführen, um zu sehen, was am besten funktioniert, wenn das für Sie wichtig ist, aber stellen Sie auch sicher, dass es tatsächlich dieser Code ist, der die Leistungsengpässe verursacht. (Verpflichtendes Donald Knuth Zitat: "Frühe Optimierung ist die Wurzel allen Übels").
Die meisten Compiler werden einen sehr guten Job dabei machen, den Code für Sie zu optimieren, würde ich sagen. Oftmals liegt es meiner Erfahrung nach an anderen Dingen als diesen Low-Level-Aspekten, die einen Unterschied machen, wie das Hinzufügen eines Early-Out-Tests oder das Minimieren der Datenmenge oder Ähnliches.
Für einen Quaternion können Sie die Klasse intern immer noch mit einem Array implementieren (falls das tatsächlich schneller ist), was den Unterschied sogar noch weniger wichtig macht.
Sie sind wahrscheinlich besser dran, wenn Sie zum Beispiel sicherstellen, dass Sie Ihre Algorithmen parallel auf Mehrkernmaschinen ausführen können oder Ihre tatsächlichen Berechnungen SSE-Anweisungen verwenden lassen.
Was den Overhead von Klassen betrifft: Es gibt keine Strafe für die Verwendung von Klassen, es sei denn, Ihre Klassen haben virtuelle Funktionen.
Beispielsweise kann ein Array von komplexen Variablen folgendermaßen geschrieben werden:
std::complex m[10][10];
Vorsicht bei STL-Sammlungsklassen, da sie tendenziell dynamische Zuweisung verwenden und manchmal erheblichen Overhead verursachen (d.h. Ich würde keine Arrays mit vector< vector<> >
erstellen).
Sie sollten die Verwendung einer Bibliothek wie Eigen für schnelle, optimierte Matrix-/Vektor-Klassen in Betracht ziehen.