Geschw.einbußen durch Schleifen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

4pac

Betreff: Geschw.einbußen durch Schleifen?

BeitragSo, Sep 19, 2004 23:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi liebe Coders,

hat eigentlich schon mal wer ausgebenchmarkt, wieviel langsamer schleifenorientiertes Programmieren gegenüber hartcodiertem ist?

Ich frage mich speziell in Bezug auf das Abarbeitungstempo im Programm, wieviel vorteilhafter Version a meiner Mausabfrage mit Mouseover-Kommentaren gegenüber Version b ist. Ihren Job tun sie beide. Und daß meine CPU im Moment öfters ein Bisschen schleift, scheint mir an was anderem zu liegen, auf meine eigenen Benchmarks zu dem Thema kann ich mich irgendwie nicht richtig verlassen.

Codebeispiel Version a:
Code: [AUSKLAPPEN]
   If RectsOverlap(263,201,500,105,mausx,mausy,1,1) Then


      For i = 0 To 10
      
         If RectsOverlap(263+(i*46),220,36,18,mausx,mausy,1,1) Then
            Color 200,200,200
            Rect mausx,mausy,160,16,1
            Color 200,0,0
            Text mausx + 15, mausy + 1, elemente_spieler$(i)
            Color 0,0,0
         End If

         If RectsOverlap(263+(i*46),277,36,18,mausx,mausy,1,1) Then
            Color 200,200,200
            Rect mausx,mausy,160,16,1
            Color 200,0,0
            Text mausx + 15, mausy + 1, elemente_spieler$(i+11)
            Color 0,0,0
         End If
            
      Next

   
   End If


Version b:

Code: [AUSKLAPPEN]
   If RectsOverlap(263,201,500,105,mausx,mausy,1,1) Then

      If RectsOverlap(263,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(0)
         Color 0,0,0
         If MouseHit(1) Then
            chemikalie$ = elemente_spieler$(0)
            chemikalie_abwiegen(chemikalie$)
         End If
      End If

      If RectsOverlap(309,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(1)
         Color 0,0,0

      End If

      If RectsOverlap(355,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(2)
         Color 0,0,0
      End If

      If RectsOverlap(401,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(3)
         Color 0,0,0
      End If

      If RectsOverlap(447,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(4)
         Color 0,0,0
      End If

      If RectsOverlap(493,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(5)
         Color 0,0,0
      End If

      If RectsOverlap(539,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(6)
         Color 0,0,0
      End If

      If RectsOverlap(585,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(7)
         Color 0,0,0
      End If

      If RectsOverlap(631,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(8)
         Color 0,0,0
      End If

      If RectsOverlap(677,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(9)
         Color 0,0,0
      End If

      If RectsOverlap(723,220,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(10)
         Color 0,0,0
      End If

      If RectsOverlap(263,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(11)
         Color 0,0,0
      End If

      If RectsOverlap(309,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(12)
         Color 0,0,0
      End If

      If RectsOverlap(355,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(13)
         Color 0,0,0
      End If

      If RectsOverlap(401,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(14)
         Color 0,0,0
      End If

      If RectsOverlap(447,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(15)
         Color 0,0,0
      End If

      If RectsOverlap(493,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(16)
         Color 0,0,0
      End If

      If RectsOverlap(539,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(17)
         Color 0,0,0
      End If

      If RectsOverlap(585,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(18)
         Color 0,0,0
      End If

      If RectsOverlap(631,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(19)
         Color 0,0,0
      End If

      If RectsOverlap(677,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(20)
         Color 0,0,0
      End If

      If RectsOverlap(723,277,36,18,mausx,mausy,1,1) Then
         Color 200,200,200
         Rect mausx,mausy,160,16,1
         Color 200,0,0
         Text mausx + 15, mausy + 1, elemente_spieler$(21)
         Color 0,0,0
      End If

   End If


Mit der For/Next Version ist es natürlich bequemer und übersichtlicher zu arbeiten. Bloß hab ich das Gefühl, das Tempo wird dadurch ganz arg runtergezogen. Ich bin mir aber nicht sicher Rolling Eyes

Grüße,
Thomas
  • Zuletzt bearbeitet von 4pac am So, Sep 19, 2004 23:27, insgesamt einmal bearbeitet

Lord_Vader

BeitragSo, Sep 19, 2004 23:20
Antworten mit Zitat
Benutzer-Profile anzeigen
OK ich seh da jez nix drin was machsten eigentlich mit dem proggi?
Nunja selbst wenn es langsamer wäre is es immernoch mehr compilierzeit und ne größere .exe im endeffekt!

4pac

BeitragSo, Sep 19, 2004 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ist ja kein ganzes Programm, nur die Mausabfrage daraus, und ich wollte gerne wissen, wieviel grundsätzlich die hartcodierte Version schneller ist als die in einer Schleife - ob das Unterschiede sind, die man in dieser Größenordnung durchaus bemerken könnte (22 einzelne Abfragen in einer Schleife), oder ob der Performancevorteil beim Hartcoden in so einem Fall nicht ins Gewicht fällt (und meine Sch.. Confused ..dreckmühle also mal wieder wegen etwas anderem lahmt).

Grüße,
Thomas

Lord_Vader

BeitragSo, Sep 19, 2004 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh also den Unterschied wird man nicht merken. Schließlich haben wirklich große spiele ja auch sehr viele schleifen für alles mögliche.
 

hot-bit

Gast

BeitragMo, Sep 20, 2004 1:19
Antworten mit Zitat
Hallo..

habe das mal getestet.

Bei 100.000.000 Durchläufen braucht die Schleifen-Variante ca. 1090 Millisekunden.
Hardgecodet ca. 1010 Millisekunden.

Also vernachlässigbar.

Kannst ruhig die Schleifen-Variante nehmen.

Toni

BladeRunner

Moderator

BeitragMo, Sep 20, 2004 3:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Vorausgesetzt dass BB eine recht "maschinennahe" Übersetzung für Schleifen vornimmt entspricht eine Schleife einem compare mit anschliessendem Jump. Das aufwendigste wird dabei der compare-teil sein, je nachdem welche Bedingung die Schleife enthält. Aber der Jump-Befehl ist innerhalb eines oder zwei Taktzyklen abgehakt, also zu vernachlässigen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

stfighter01

BeitragMo, Sep 20, 2004 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
und selbst wenn der code 10mal so langsam wär würde ich das teil nicht ohne schleifen programmieren Razz

weil -> so öde soll programmieren nicht sein Confused
Denken hilft!

4pac

BeitragMo, Sep 20, 2004 10:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hot-bit hat Folgendes geschrieben:
habe das mal getestet.

Bei 100.000.000 Durchläufen braucht die Schleifen-Variante ca. 1090 Millisekunden.
Hardgecodet ca. 1010 Millisekunden.


Danke, Toni!!

Jan_

Ehemaliger Admin

BeitragMo, Sep 20, 2004 10:25
Antworten mit Zitat
Benutzer-Profile anzeigen
der kompiler löst das per Goto
und einer If abfrage.
es geht schneller per Repeat until mit eigener If abfrage.
aber in diesem beispiel währe das zu vernachlässigen.
between angels and insects

tft

BeitragMo, Sep 20, 2004 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi....

für dieses Problem des Hardcodens und die geschwindigkeits verluste durch schleifen bei langsamen rechnern habe ich im PreCompiler macros eingefürt. Damit kann man solche code ketten erzeugen. Es wird auch Counter Variablen geben und MacroIf anweisungen. Aber das dauert noch eine weile.

Zu finden unter www.optima-code.ch/precompiller.htm
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
 

hot-bit

Gast

BeitragMo, Sep 20, 2004 15:36
Antworten mit Zitat
Hi,

also ich denke mir, daß die Geschwindigkeit auf einem System immer die gleiche bleibt, ob mit oder ohne Schleifen.

Warum dann Code-Ketten erzeugen ?

Leuchtet mir nicht ein !

Außerdem, für die Anwendung, für die 4Pac es braucht, ist es völlig egal, ob mit oder ohne Schleifen.
Aber zum Verständnis und übersichtsmäßig schaut es mit einer Schleife viel besser aus. Finde ich halt.

Toni

tft

BeitragMo, Sep 20, 2004 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi....

@HotBit

du hast im grunde natürlich recht. Für die meisten sachen braucht es keine Geschwindigkeits Optimierung.

Aber was die Code Ketten anbelangt kann ich dir folgendes erklären.

Je nach Processor wird der Code unterschiedlich forbereitet bevor diese abgearbeitet wird. Gerade die älteren haben oft nur wenig bis garkeinen ausreichenden Code Cache. Sodas Schleifen meistens grösser sind als der Cache zur verfügung stellt. Ist dies der Fall dauert das abarbeiten je nach schleifen aufbau und länge 2 bis dreimal so lange. Dann gibt es ja noch die JMP vorkalkulation. Diese berechnet die warscheinlichkeit eines bedingten Sprunges im Code. Gerade bei schleifen konstrucketen haut die offt daneben. Mach doch einfach mal einen Test. Erzeuge eine For to next schleife die 1000000 mal etwas rechent. Und ermittle die Zeit die es dafür braucht. Dann die For Next schleife einfach mal leer testen. Dann siest du wiefiel von der zeit alleine für das Schleifen konstruckt verwendet wird.

Diese art der Speed optimierung ist zwar selten nötig. Aber zu zeiten eines P3 noch an der Tagesortnung. Bei eine P4 ist der Cache mitlerweile so gross, das die schleife schon recht gross ausfallen kann ehe ein Code overrun auftritt.

Das nur zur Erläuterung.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group