Ich habe einen C-Code geschrieben, den ich als MATLAB-Format anrufe, nachdem ich ihn mit MEX kompiliert habe. Im Innern des C-Code, messe ich die Zeit ein Teil der Berechnung mit dem folgenden Code:MATLABs Taktdiskrepanz von Tic-Toc & C
clock_t begin, end;
double time_elapsed;
begin = clock();
/* do stuff... */
end = clock();
time_elapsed = (double) ((double) (end - begin)/(double) CLOCKS_PER_SEC);
verstrichene Zeit die Ausführungszeit in Sekunden sein sollte.
Ich gebe dann den Wert time_elapsed
zu MATLAB (es wird ordnungsgemäß exportiert; ich überprüfte). Dann MATLAB-Seite rufe ich diese C-Funktion (nachdem ich es mit MEX kompilieren) und ich messen 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 feststellen:
- 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.
- Die im C-Code gemessenen Ausführungszeiten sind sehr verstreut und weisen sehr hohe st. Abweichung (Variationskoeffizient 44%, verglichen mit nur 13% für Tic-Toc).
Was ist mit diesen Timern los?
Was ist die Auflösung der Uhr? Woher wissen wir, ob 'begin = clock();' kurz vor oder kurz nach dem Auftreten eines Clockticks ausgeführt wird? Beeinflusst das das Ergebnis? Wahrscheinlich. –
@BoPersson Also meinst du, dass 'clock()' höchstens einen Tick verpassen kann? –
Ich meine, dass ein Tick groß genug sein könnte, um das Ergebnis zu beeinflussen. Wie 18 ms. –