Seite 1 von 3

Kurios-Inkrement Funktion in C als Library schneller? Nein!

Verfasst: 31.10.2004 00:14
von grapy
Hallo,

habe mal so zum Testen eine Library Funktion in C geschrieben: inc(*toinc)

und festgestellt, das dieser Code (~1,4 s) doppelt so schnell ist ...

Code: Alles auswählen

For x = 1 To 100000000
inc(@test)
Next
... wie dieser Code (~2,8 s):

Code: Alles auswählen

For x = 1 To 100000000
test+1
Next
echt krass, oder?

:mrgreen: grapy

Verfasst: 31.10.2004 00:47
von MVXA
mmmh, ich find das eher merkwürdig. ich dachte purebasic sei genauso schnell wie C :?

Verfasst: 31.10.2004 01:39
von Falko
Ist es auch so bei While..Wend? da kriege ich ungefähr 1.82s raus

Code: Alles auswählen

Global Ausgabe.f,Ausgabe1.f,Ausgabe2.f
Zeit=ElapsedMilliseconds()
While test<100000000
test+1
Wend
Zeit1=ElapsedMilliseconds() 
Ausgabe=(Zeit1-Zeit)/1000
MessageRequester("Zeitmessung","While/Wend: ~"+Strf(Ausgabe))
> [Edit]Der Debugger bremst das wirklich stark aus
> Ohne sind's natürlich ca. 0,26s

Verfasst: 31.10.2004 01:40
von Deeem2031
PB moved die Variable warscheinlich erst in einen Register erhöht sie da und moved 'se dann zurück, C hingegen wird die ohne ohne den Register erhöhen, das wär jedenfalls eine logische Erklärung dafür.
Sollte Fred, wenn's so ist vielleicht mal ändern.

EDIT: @Falko Is doch Schnuppe welche Schleife du nimmst, sind doch immer die selben, brauch also auch immer gleich lange...

EDIT2: Hmm.., stimmt doch nich. PB macht das auch ohne Register...

Verfasst: 31.10.2004 01:46
von MVXA
eben nicht 8)
jede scleife hat seine vorzüge.
while / wend z.b. muss im gegensatz zu for / next keine variable einen wert zu ordnen bevor while / wend weiter machen kann.

Re: Kurios - Inkrement Funktion in C als Library schneller..

Verfasst: 31.10.2004 01:48
von Kristel
grapy hat geschrieben:...habe mal so zum Testen eine Library Funktion in C geschrieben: inc(*toinc)
Könnten wir uns die Funktion bitte einmal ansehn, denn ich kann mir nicht vorstellen, dass C bei so einer einfach Sache doppelt so schnell ist.

Verfasst: 31.10.2004 01:49
von Deeem2031
@LittleFurz: Das meinte ich doch garnicht, ich meinte nur das jede Schleife genauso lange wie die selbe Schleife dauert.. es also egal ist welche Schleife man nimmt, am Ergebniss welche schneller ist ändert sich nichts. Das einzige was passieren kann ist das beide Werte höher/tiefer sind.

Verfasst: 31.10.2004 01:50
von freak
"test+1" wird in "INC dword [v_test]" umgewandelt. Das kannste gar nicht schneller machen.
Du hast also irgendwo gewaltig mist gebaut mit deiner Zeitmessung.

Bestimmt war wieder der Debugger an... :roll:

Verfasst: 31.10.2004 01:54
von MVXA
achso :oops:

Verfasst: 31.10.2004 02:06
von Falko
Sch.... Debugger. :mrgreen:

Code: Alles auswählen

;Debugger bitte ausschalten
Zeit=ElapsedMilliseconds()
For i=1 To 100000000
test+1
Next i
Zeit1=ElapsedMilliseconds() 
Ausgabe.f=(Zeit1-Zeit)/1000
;
test=0
Zeit=ElapsedMilliseconds()
Repeat
test+1
Until test=100000000
Zeit1=ElapsedMilliseconds() 
Ausgabe1.f=(Zeit1-Zeit)/1000
;
;
test=0
;
Zeit=ElapsedMilliseconds()
While test<100000000
test+1
Wend
Zeit1=ElapsedMilliseconds() 
Ausgabe2.f=(Zeit1-Zeit)/1000
MessageRequester("Ausgabe","For/Next: ~"+StrF(Ausgabe)+Chr(10)+Chr(13)+"Repeat/Until: ~"+StrF(Ausgabe1)+Chr(10)+Chr(13)+"While/Wend: ~"+StrF(Ausgabe2))
Jetzt mal ohne Debugger getestet und da kriege ich
0,23s ; 0,18s ; 0,26s raus. (Danke @Freak, habe auch mal ausgemisstet :mrgreen:)