Geschwindigkeitsvergleich von Matlab und C
Im Rahmen meines Projekt musste ich ein Programm in Matlab schreiben, dass relativ große Dateien einliest und daraus bestimmte Dinge berechnet.
Konkret sieht das so aus: Die Dateien bestehen aus einem etwa 500 byte großen Header, in dem unter anderem die Anzahl der folgenden Datensätze kodiert ist, und dann einige zig bis mehrere hunder Megabyte an binärdaten, die als 32 bit unsigned Integer vorliegen. Die ersten vier Bit geben die Nummer eines Kanals an, oder wenn alle ersten vier bits auf 1 gesetzt sind, einen Überlauf.
Die hinteren 28 Bits sind ein Zeitstempel, der eingehende Signale auf 4ps (Picosekunden) auflöst.
Die Aufgabe war nun im Wesentlichen (auch wenn mir das etwas anders gesagt wurde), aus den Daten ein Histogramm zu bauen (bei den Testdaten etwa 64000 Bins lang), und damit eine Korrelation zu berechnen, und dann aus den ursprünglichen Daten noch ein paar Werte zu extrahieren.
Das Programm in Matlab war relativ schnell fertig geschrieben, aber es ist langsam. Grauenhaft langsam. Für eine 155MB große Eingabedatei rechnet das Programm etwa 6 Stunden auf meinem Laptop. Dafür mache ich vor allem die I/O-Operationen und Arrayzugriffe verantwortlich, die anscheinend nicht besonders effizient implementiert sind.
Also habe ich das gleiche noch in C implementiert. Ergebnis: die Laufzeit ist unter einer Minute, locker. Es ist noch nicht ganz fertig, bisher braucht es knapp 20s, unter 50s werde ich sicher bleiben. Und dabei ist das ganze noch ohne jegliche Optimierungen kompiliert.
Jetzt kann man ja sagen: Ist ja alles schön und gut, Matlab ist eher dafür geeignet, Vektoroperationen durchzuführen, die internen Matlabfunktionen sind da recht schnell.
Aber das beste kommt noch: Ich führe die Korrelation auf die Faltung zurück, und die scheint in Matlab auch nicht sehr effizient implementiert zu sein. Tatsächlich scheint Matlab mehrere Minuten an der Faltung zu rechnen.
Meine C-Implementierung führt die Faltung auf die schnelle Fouriertransformation zurück, berechnet mit der FFTW-Bibliothek. Und bleibt damit unter 5s.
Alles in allem war matlab in diesem Fall für rapid prototyping gar nicht schlecht, scheidet aber aufgrund grauenhafter Performance aus.


