Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 22.08.2006, 16:34 Titel: Codevergleich |
|
|
Hi Forum,
habe zwei verschieden Codeabschnitte, beide machen natürlich das selbe und ich möchte vergleichen welcher der beiden schneller ist :
Code: |
#define gr(a, b) (a*abs(a>=b)+b*abs(b>a))
#define kl(a, b) (a*abs(a<b) +b*abs(b<=a))
DIM a, b, c, d AS INTEGER
dim i1(1 to 10) as integer
dim i2(1 to 10) as integer
a = 1
b = 2
i = 0
now = TIMER
DO
c = gr(a,b)
i += 1
LOOP UNTIL TIMER >= (now+1)
print i
i = 0
now = TIMER
DO
IF a>b THEN c=a ELSE c=b
i += 1
LOOP UNTIL TIMER >= (now+1)
print i
SLEEP
|
Meine Überlegung ist das beim schnelleren Code i größer sein müßte als beim langsameren. Leider spuckt mir das Programm bei drei oder vier verschiedenen Durchgängen so unterschiedliche Werte aus das ich nicht sagen kann welcher Code nun besser ist.
Weiß jemand Rat ? |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 22.08.2006, 16:40 Titel: |
|
|
Wenn ich es richtig sehe lässt du dem Programm jeweils 1 Sekunde Zeit seinen Test durchzuführen. Dies reicht bei weitem nicht aus.
Echte Testwerte erhälst du erst ab knapp 10 Sekunden. dort sind die Werte dann auch nicht mehr so unterschiedlich.
also
Code: |
LOOP UNTIL TIMER >= (now+10)
|
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 22.08.2006, 19:13 Titel: |
|
|
@ A. K.
Habe Deinen Rat befolgt, den Timer auf 10sek. gesetz, ne' Schleife drum gebastelt und die Ausgabe in eine Datei geschrieben. Hier das Ergebnis :
Zitat: | 11966081
11740430
****************************************
11876882
11915268
****************************************
11904198
11894269
****************************************
11917258
11998280
**************************************** |
Nun weiß ich immer noch nicht was schneller ist, ne IF-Anweisung oder ein gleichwertiger mathematischer Ausdruck ? |
|
Nach oben |
|
 |
A.K.

Anmeldungsdatum: 02.05.2005 Beiträge: 467 Wohnort: HH
|
Verfasst am: 22.08.2006, 19:23 Titel: |
|
|
Hi,
bei den Test's mit 10 Sek. hast du knapp eine Fehlertolleranz von ~1%, dies ist vertretbar und bedeutet in diesem Fall das du davon ausgehen kannst das beide Möglichkeiten gleichschnell sind.
Die verschiedenen Werte können unterschiedlichste Ursachen haben. Die wichtigste ist dabei die momentane Prozessorauslastung. Die wird durch alle Prozesse geregelt aktuell laufen mit deren Prioritäten.
Desweiteren kommen noch Hardwarebereitschaften und weiteres hinzu.
Ein Tastendruck z.B. führt auch zu einer kleinen Verzögerung des Programmes und und und...
Im Grunde genommen ist es so:
Je länger du einen Test laufen lässt desto genauer ist das Ergebnis.
Wenn du nun die Testzeit auf 100 Sekunden festlegst hast du eine Testtolleranz von ungefähr ~0.1% und solltest eine Aussage über die Geschwindigkeit treffen können.
MFG A.K. _________________
http://forum.IconSoft.de
http://www.pnpbb.de - hol dir jetzt dein eigenes kostenloses Forum *NEU* |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 22.08.2006, 19:39 Titel: |
|
|
Man kann das auch von FreeBASIC testen lassen, ohne Timer zu benutzen, ob das in deinem Fall ein einigermaßen gescheites ergebniss liefert, weiß ich nicht.
Beispiel:
Code: | sub test1()
Dim As Integer i
Dim As String*300 test
For i = 1 to 255
test[i]=i
Next i
end sub
sub test2()
Dim As integer i
Dim As String*300 test
For i = 1 to 254
Mid(test,i,1)=Chr(i)
Next i
end sub
test1
test2
|
Wenn man diesen Code mit -profile kompiliert, dann misst FreeBASIC die Zeit, die die Funktionen zum ausführen brauchen, und speichert das ergebnis in einer Datei(profile.txt).
Die sieht in dem Fall so aus:
Code: | Profiling results:
------------------
Executable name: /home/hml/Michael/fb.bas/a
Launched on: 08-22-2006, 19:46:34
Total program execution time: 0.005469 seconds
Per function timings:
Function: Time: Total%: Proc%:
(main) 0.00547 100.00%
TEST2 0.00545 99.67% 99.67%
TEST1 0.00001 0.11% 0.11%
TEST2 0.00545 99.67%
FB_CHR 0.00100 18.29% 18.35%
FB_STRASSIGNMID 0.00089 16.32% 16.37%
FB_STRALLOCTEMPDESCF 0.00085 15.47% 15.53%
Global timings:
(main) 0.00547 (100.00%)
TEST2 0.00545 (99.67%)
FB_CHR 0.00100 (18.29%)
FB_STRASSIGNMID 0.00089 (16.32%)
FB_STRALLOCTEMPDESCF 0.00085 (15.47%)
TEST1 0.00001 (0.11%)
|
So sieht man, das Mid() sehr langsam ist.
Du kannst so ja mal dein Programm testen, und gucken, ob die Werte gleich sind, mit deinem 2. Test. |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 22.08.2006, 20:15 Titel: |
|
|
Das mit der Compileroption -profile habe ich ausprobiert leider legt der Compiler bei mir keine Textdatei mit den gewünschten Informationen an. |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 22.08.2006, 22:14 Titel: |
|
|
Hast du auch die 2 verschiedenen codes in jeweils einer function geschrieben? Sonst geht das nicht, denn Freebasic misst nur, wie lange die einzelnen funktionen brauchen. |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 23.08.2006, 09:35 Titel: |
|
|
Tja, habe es in zwei verschiedene funktionen gepackt - wieder kein Erfolg.
Ich habe Compiler Versionen (v0.14;v0.15;v0.16b) ausprobiert, jeweils nichts.
mfg |
|
Nach oben |
|
 |
Michael Frey

Anmeldungsdatum: 18.12.2004 Beiträge: 2577 Wohnort: Schweiz
|
Verfasst am: 23.08.2006, 17:17 Titel: |
|
|
Code: | #define gr(a, b) (a*abs(a>=b)+b*abs(b>a))
#define kl(a, b) (a*abs(a<b) +b*abs(b<=a))
sub one
DIM a, b, c, d AS INTEGER
for i=0 to 1000000
c = gr(a,b)
next i
end sub
sub two
DIM a, b, c, d AS INTEGER
for i=0 to 1000000
IF a>b THEN c=a ELSE c=b
next i
end sub
one
two |
Zitat: | Command executed:
"C:\FreeBASIC\fbc.exe" "C:\FreeBASIC\peform.bas" -profile
Results:
Compilation successful
Generated executable: C:\FreeBASIC\peform.exe
System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.16 for win32 (target:win32)
OS: Windows XP (build 2600, Service Pack 2) |
Code: | Profiling results:
------------------
Executable name: C:\FreeBASIC\peform.exe
Launched on: 08-23-2006, 17:14:03
Total program execution time: 0.01854 seconds
Per function timings:
Function: Time: Total%: Proc%:
(main) 0.01854 100.00%
ONE 0.01374 74.09% 74.09%
TWO 0.00480 25.87% 25.87%
Global timings:
(main) 0.01854 (100.00%)
ONE 0.01374 (74.09%)
TWO 0.00480 (25.87%) |
Variante 2 ist also schneller. _________________ http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight |
|
Nach oben |
|
 |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 23.08.2006, 19:24 Titel: |
|
|
Danke Michael Frey,
ich weiß jetzt warum es nicht funktionierte.
FBC gibt folgende Kommandozeilenparameter an :
Zitat: |
FBC [command] [file.name]
|
mit
Zitat: |
FBC [file.name] [command] |
funktioniert der Spaß. Danke und das Thema kann geschlossen werden.
mfg |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 23.08.2006, 23:29 Titel: |
|
|
chutullu hat Folgendes geschrieben: | Danke und das Thema kann geschlossen werden. |
Themen werden nicht geschlossen, ausser man spricht über virenprogrammierung, bei zu viel gespamme, etc  |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 25.08.2006, 13:51 Titel: |
|
|
Hi,
auch wenn das Thema für chutullu schon erledigt ist,
unter http://www.freebasic.net/forum/viewtopic.php?p=34325#34325 findet man ein Testprogramm das die Anzahl der Taktzyklen für Programmteile messen kann.
Meiner Meinung nach sehr gut gemacht.
Hier hab ich es zB. mal gebraucht http://forum.qbasic.at/viewtopic.php?p=35719#35719
Eine wichtige Erkenntnis habe ich erst nachträglich erhalten,
zwischen Intel und AMD Prozessoren (P4) bestehen bei gleichem Quellcode erhebliche Unterschiede in der Zyklenanzahl.
Gruß Volta _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
|