MATLABs Tic-Toc & C-Taktdiskrepanz

8

Ich habe einen C-Code geschrieben, den ich MATLAB benutze, nachdem ich ihn mit MEX kompiliert habe. Innerhalb des C-Codes messe ich die Zeit eines Teils der Berechnung unter Verwendung des folgenden Codes:

%Vor%

Die verstrichene Zeit sollte die Ausführungszeit in Sekunden sein.

Ich gebe dann den Wert time_elapsed an MATLAB aus (es wird korrekt exportiert; ich habe es überprüft). Dann MATLAB-Seite rufe ich diese C-Funktion auf (nachdem ich sie mit MEX kompiliert habe) und messe die Ausführungszeit mit tic und toc . Was sich als vollständige Absurdität herausstellt, ist, dass die Zeit, die ich mit Tic und Toc berechne, 0,0011s (Durchschnitt bei 500 Läufen, st. Dev. 1,4e-4) beträgt, während die Zeit, die vom C-Code zurückgegeben wird, 0,037s beträgt ( durchschnittlich 500 Runs, St. Dev. 0.0016).

Hier kann man zwei sehr merkwürdige Tatsachen bemerken:

  1. Die Ausführungszeit für die gesamte Funktion ist niedriger als die Ausführungszeit für einen Teil des Codes. Daher sind entweder die Messungen von MATLAB oder C stark ungenau.
  2. Die im C-Code gemessenen Ausführungszeiten sind sehr verstreut und weisen sehr hohe st auf. Abweichung (Variationskoeffizient 44%, verglichen mit nur 13% für Tic-Toc).

Was ist mit diesen Timern los?

    
Pantelis Sopasakis 31.01.2013, 22:55
quelle

1 Antwort

6

Sie vergleichen Äpfel mit Orangen.

Schau dir Matlabs Dokumentation an:

tic - Ссылка
toc - Ссылка

Mit

tic und toc können Sie die tatsächlich abgelaufene Zeit messen.

Sehen Sie sich nun die Uhr Funktion Ссылка an.

Insbesondere

  

Die Funktion clock () gibt eine vom Programm verwendete Approximation der Prozessorzeit zurück.

     

Der zurückgegebene Wert ist die CPU-Zeit, die bisher verwendet wurde als clock_t; zu   Erhalte die Anzahl der Sekunden, die du benutzt hast, dividiere durch CLOCKS_PER_SEC. Wenn die   Prozessorzeit ist nicht verfügbar oder ihr Wert kann nicht sein   dargestellt, gibt die Funktion den Wert (clock_t) -1 zurück.

Was kann für Ihren Unterschied verantwortlich sein?

  • CPU-Zeit (gemessen durch Uhr ()) und reale verstrichene Zeit (gemessen mit Tic und Toc) sind NICHT gleich. Sie erwarten also, dass die CPU-Zeit geringer ist als die verstrichene Zeit? Vielleicht. Was, wenn Sie innerhalb von 0,0011s 10 Kerne bei 100% fahren? Das würde bedeuten, dass die Takt () -Messung 10x ist, die mit Tic und Toc gemessen wurde. Möglich, unwahrscheinlich.
  • clock (.) ist grob ungenau und in Übereinstimmung mit der Dokumentation ist es eine ungefähre CPU-Zeitmessung! Ich vermute, dass es an die Scheduler-Quantengröße gebunden ist, aber ich habe den Linux-Kernel-Code nicht durchgecheckt, um das zu überprüfen. Ich habe auch nicht auf anderen Betriebssystemen nachgeschaut, aber dieser Blog des Kumpels ist im Einklang mit dieser Theorie.

Also was zu tun ist ... für den Anfang vergleichen Sie Äpfel mit Äpfeln! Stellen Sie als nächstes sicher, dass Sie die Timer-Auflösung berücksichtigen.

    
thang 01.02.2013, 03:44
quelle

Tags und Links