Algorithmen auf Zeit testen...

Anfängerfragen zum Programmieren mit PureBasic.
Schlingel
Beiträge: 30
Registriert: 28.06.2007 20:06

Algorithmen auf Zeit testen...

Beitrag von Schlingel »

Hallo,

da es innerhalb von PB(4.02) ja lediglich die ElapsedMilliseconds() gibt, wird das Ergebnis meist 0 da sie unterhalb der milli's liegen.

Darum habe ich mir folgende möglk. ausgedacht aber glaube die ist nicht unbedingt sinnvoll... gibt es evtl. ne Api oder so ?
Das lediglich ein kleines Demobeispiel... denkweise dahinter ist klar pro Zeile ein Delay summiert sicht auf und erhalte so ne Zahl um zumind. die Komplexität abzuleiten. Aber das gibt mir nicht. den Realen Zeitaufwand..

(einfache aufgabe a*sqr(x) + b*sqr(y), nur Demo)

Code: Alles auswählen

a=7
x=27
b=4
y=48
zeit_on = ElapsedMilliseconds()
  a=a*a : Delay(1) 
  b=b*b : Delay(1) 
  
  x=a*x : Delay(1) 
  y=b*y : Delay(1) 
  
  x = Sqr(x) : Delay(1) 
  y = Sqr(y) : Delay(1)
  
  x = x+y : Delay(1) 
zeit_off = ElapsedMilliseconds()

Code: Alles auswählen

zeit_on = ElapsedMilliseconds()
  Gosub ggt:

  x = x/x2 : Delay(1) 
  y = y/x2 : Delay(1) 
  
  x = Sqr(x) : Delay(1) 
  y = Sqr(y) : Delay(1) 
  
  a = a*x : Delay(1) 
  b = b*y : Delay(1)
  
  
  a = a + b : Delay(1) 
  x = a * Sqr(x2) : Delay(1)
  
zeit_off = ElapsedMilliseconds()

ggt:

  h.l
  y2.l
  
  x2 = x : Delay(1) 
  y2 = y : Delay(1) 
  
  While (y2 <> 0)
  
    h = x2 % y2 : Delay(1) 
    x2 = y2 : Delay(1) 
    y2 = h : Delay(1) 
    
  Wend

  ;x2 als "return"
Return
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Eine Methode, die oft verwendet wird, ist es einfach eine Schleife draus zu machen. Dabei gibt es zwar einen Overhead durch die Schleife. Aber der ist vernachlässigbar. Vorallem wenn es um Vergleichstests geht.

Du verlängerst dadurch die Ausführungszeit halt auf eine messbare Zeit.

Code: Alles auswählen

a=7
x=27
b=4
y=48

zeit_on = ElapsedMilliseconds()

For i = 1 To 10000000

  a=a*a
  b=b*b
 
  x=a*x
  y=b*y
 
  x = Sqr(x)
  y = Sqr(y)
 
  x = x+y

Next

zeit_off = ElapsedMilliseconds()

Debug zeit_off - zeit_on
Ansonsten gibt es noch High-Res-Timer, z.b. über die API den QueryPerformanceCounter. Aber man ist bei einem Multitasking-System besser bedient, wenn man Messungen über einen längeren Zeitraum durchführt.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag von GreyEnt »

ich hätte da mal eine frage der ausführgeschwindigkeit.
Und zwar hab ich eine Schleife die ca. 21000Millisec zur ausführung braucht. Klasse da kann man was dran optimieren. dachte ich.

Alt
schleifenanfang
a= ( (b-1)*xk+c ) * 100 / (xk*yk)
schleifenende

Neu
p.f=1/(xk*yk)*100
schleifenanfang
a= ( (b-1)*xk+c ) * p.f
schleifenende

Aber die Neue Schleife braucht länger als die Alte, obwohl die neue einfacher ist.
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Wird wohl an Fload hängen, Longs sind schneller als Fload...
Eine Art Query-Planner soll die Ausführung von Map/Reduce-Funktionen in Hadoop stark beschleunigen.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Verstehe ich richtig, du möchtest Zeitabstände <10 ms messen?
In diesem Forum wurde bereits vielfach diskutiert, dass auf unterschiedlichen Betriebssystem, vor allem Windows, die Differenz zwischen zwei ElapsedMilliseconds() aufrufen bis zu 16 ms betragen kann.

Es gibt eine API, die einen sogenannten "hochauflösenden Timer" (sofern vorhanden, ist ein Hardwareteil im PC) verwednet.
Schau dir dazu mal bitte QueryPerformanceCounter() an. Dazu gibt es noch ein oder zwei QueryPerformance*-Befehle, die mir momentan nicht einfallen. Das steht aber in der MSDN, natürlich.

Lies dir doch bitte dazu diesen Thread hier durch, dort wird über das Messen von sehr kurzen Zeitabständen in Verbindung mit Screens/FPS diskutiert: http://www.purebasic.fr/german/viewtopi ... erformance
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Schlingel
Beiträge: 30
Registriert: 28.06.2007 20:06

Beitrag von Schlingel »

Naja als Beispiel z.b. wenn ich Fibonacci Zahlen zusammen rechne da würde Rekursiv schnell ja enorme Zeit brauchen während iterativ entsprechend sehr schnell geht auch bei einem großen n. D.h. da würde selbst bei solch vielen durchläufen für ElapsedMilliseconds() noch nicht messbares sein.
Du verlängerst dadurch die Ausführungszeit halt auf eine messbare Zeit.


For i = 1 To 10000000
...
Aber QueryPerformanceCounter() werde ich mir mal anschauen ... bei Gelegenheit.
Erstmal danke für die Antworten.
Antworten