Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Codevergleich

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 22.08.2006, 16:34    Titel: Codevergleich Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 22.08.2006, 16:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 22.08.2006, 19:13    Titel: Antworten mit Zitat

@ 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
Benutzer-Profile anzeigen Private Nachricht senden
A.K.



Anmeldungsdatum: 02.05.2005
Beiträge: 467
Wohnort: HH

BeitragVerfasst am: 22.08.2006, 19:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 22.08.2006, 19:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 22.08.2006, 20:15    Titel: Antworten mit Zitat

Das mit der Compileroption -profile habe ich ausprobiert leider legt der Compiler bei mir keine Textdatei mit den gewünschten Informationen an.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 22.08.2006, 22:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 23.08.2006, 09:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 23.08.2006, 17:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 23.08.2006, 19:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 23.08.2006, 23:29    Titel: Antworten mit Zitat

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 zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 25.08.2006, 13:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz