Ich habe an einer portablen C-Bibliothek gearbeitet, die Bildverarbeitung durchführt.Wie kann ich Leistungsoptimierungen in C testen?
Ich habe ziemlich viel Zeit in ein paar Low-Level-Funktionen investiert, um GCC-Auto-Vectorization (SSE und/oder AVX je nach Zielprozessor) -Modus zu nutzen und trotzdem einen etwas portablen C-Code (Erweiterungen) beizubehalten verwendet: restrict
und __builtin_assume_aligned
).
Jetzt ist es Zeit, den Code auf Windows (MSVC-Compiler) zu testen. Aber davor würde ich gerne eine Art Unit-Test machen, um mich nicht in den Fuß zu schießen und alle meine sorgfältig ausgewählten Anweisungen zu verlieren, um den GCC-Auto-Vektorisierungs-Code wie er ist zu erhalten.
Ich könnte einfach #ifdef/#endif
die ganze Körperfunktion, aber ich denke an eine langfristige Lösung, die auf Compiler-Update (s) jeder Regression erkennen würde.
Ich bin ziemlich sicher mit Unit-Tests (es gibt Tonnen von guten Rahmenbedingungen da draußen), aber ich bin viel weniger zuversichtlich mit Unit-Tests von solchen Low-Level-Funktionalität. Wie integriert man Performance-Unit-Tests in CI-Services wie Jenkins?
PS: Ich möchte hartcodierte Timing Ergebnisse basierend auf einem bestimmten Prozessor zu vermeiden, speichern, zB:
// start timer:
gettimeofday(&t1, NULL);
// call optimized function:
...
// stop timer:
gettimeofday(&t2, NULL);
// hard code some magic number:
if(t2.tv_sec - t1.tv_sec > 42) return EXIT_FAILURE;
Haben Sie nicht optimierte (generische) Funktionen? Es wäre besser, die Ausführungszeit mit ihnen zu vergleichen ... was bedeutet, dass "t_opt" kleiner als "t_non_opt" ist ... aber selbst das ist keine 100% ige Garantie. Andere Prozesse können zufälligen Festplattenzugriff parallel ausführen, Ihr Test könnte jederzeit beendet werden ... und eine Menge anderer Dinge könnten nicht in Ihren Tests passieren ... – zaufi
Worauf zielen Sie? Möchten Sie sicherstellen, dass Ihr Code nach Ihren Änderungen korrekt bleibt (dann würden Sie Komponententests durchführen) oder möchten Sie die Leistung des resultierenden Codes überprüfen (der etwas anders ist und auf verschiedene Arten angesprochen werden kann)? In letzterem Fall möchten Sie vielleicht sogar den generierten Assembler-Code ausdrucken, um ihn mit Ihren Erwartungen zu vergleichen. –
@DirkHerrmann das ist der springende Punkt! Wie drucke ich "tragbaren" Assemblercode? Dies hängt von der exakten gcc-Version ab, danke für weitere Details, wenn Sie mit dem Generieren von Assembler-Code vertraut sind. – malat