Geschw.einbußen durch Schleifen?
Übersicht

![]() |
4pacBetreff: Geschw.einbußen durch Schleifen? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() Grüße, Thomas |
||
- Zuletzt bearbeitet von 4pac am So, Sep 19, 2004 23:27, insgesamt einmal bearbeitet
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.. ![]() Grüße, Thomas |
||
![]() |
Lord_Vader |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-bitGast |
![]() 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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
und selbst wenn der code 10mal so langsam wär würde ich das teil nicht ohne schleifen programmieren ![]() weil -> so öde soll programmieren nicht sein ![]() |
||
Denken hilft! |
![]() |
4pac |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-bitGast |
![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!!!!! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group