2016-08-08 8 views
2

Im bmark Programm wird die Ausführungszeit wie folgt berechnet:Ausführungszeit in Miracl Bibliothek

Zum Beispiel für EC Punktmultiplikation:

#define MIN_TIME 10.0 
#define MIN_ITERS 20 
start=clock(); 
do { 
ecurve_mult(); 
iterations++; 
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; 
} while (elapsed<MIN_TIME || iterations<MIN_ITERS); 
elapsed=1000.0*elapsed/iterations; 
printf("ER - %8d iterations",iterations); 
printf(" %8.2lf ms per iteration\n",elapsed); 

Die Frage ist: Warum nicht einfach verwenden:

start=clock(); 
ecurve_mult(); 
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC; 
printf("%f\n",elapsed*1000.0); 

mit anderen Worten, was ist der Zweck der Verwendung MIN_TIME und MIN_ITERS

NB: Die zwei Codes geben unterschiedliche Ausgänge.

Antwort

0

Der Code versucht ecurv_mult() oft genug ausführen, um den Mangel an Präzision bei der Zeitmessung zu bilden . Der Loop stellt also sicher, dass er mindestens 20 Mal und mindestens 10 Sekunden lang ausgeführt wird.

Da einige Maschinen so schnell sein können, dass die Ausführung von 20-mal nicht genug Zeit ist, um die genaue Präzision zu erhalten, stellen wir sicher, dass es mindestens 10 Sekunden dauert, egal wie schnell wir diese 20 Mal gemacht haben.

Wenn wir es nur einmal machen, wird unsere Leistungsmessung nicht sehr genau sein, weil die Auflösung der Uhr zu hoch ist (z. B. gibt uns die Uhr 1 ms, während der Benchmark in 500us läuft).

+0

Danke Sasha, aber was ist mit der Anweisung: verstrichen = 1000,0 * abgelaufen/Iterationen; – zof

+0

@zof Also hast du eine hoffnungslos ungenaue Stichprobe von 1 mal 1000 multipliziert. Jetzt hast du einen Wert, dessen Zuverlässigkeit gleich klein ist, aber 1000x größer. Immer noch nicht nützlich! Ist Ihnen klar, dass mehrere Samples und Mittelungen erforderlich sind, um nützliche Schätzungen zu erhalten, denn wenn Sie nur einmal oder nur eine kleine Anzahl von Malen ausführen, ist es anfälliger für Zufallsfehler oder unvorhersehbare Dinge wie, ich weiß nicht, Ihre Computer, der sich dafür entscheidet, eine Hintergrundaufgabe gleichzeitig auszuführen? Ich empfehle Ihnen dringend, einige rudimentäre statistische Begriffe zu lesen, vor allem _sample size_. –

+0

... Ich meine, das ist eine Art Parallele zu der Uhrauflösung, auf die Sasha zu Recht hingewiesen hat, aber beide zu berücksichtigen, ist gleichermaßen wichtig, um jedem Benchmark einen Nutzen zu verleihen. –

0

Dieser Code führt die Funktion ecurve_mult mehrmals aus, um eine durchschnittliche Laufzeit zu erhalten.

MIN_ITERS gibt die Mindestzahl für die Ausführung der Funktion an, während MIN_TIME die minimale kumulative Laufzeit angibt.

In diesem Fall muss die Funktion entweder 20 Mal oder für insgesamt 10 Sekunden ausgeführt werden, je nachdem, was zuerst eintritt.

Im Gegensatz dazu führt das zweite Code-Snippet nur einmal den Code aus.

BTW, die folgende ist ungültig:

printf(elapsed*1000.0); 

Es sollte:

printf("%f\n",elapsed*1000.0); 
+0

Vielen Dank für die Antwort – zof