Seite 1 von 2
Schleifen, Compiler und Geschwindigkeit
Verfasst: 28.03.2006 09:34
von Lebostein
Hi,
folgender Code:
Code: Alles auswählen
a = 20000
b = 200
i = a
While i < a + b
Debug i
i + 1
Wend
Meine Frage: Wird bei jedem Schleifendurchlauf die Addition a + b ausgeführt ? Oder wird schon im vorraus a + b gegen einen konstanten Wert ersetzt, da sich ja a und b während der Schleife nicht ändern?
PS: Wie komme ich für diese kleine Beispiel an den Assembler-Code heran?
Verfasst: 28.03.2006 09:58
von helpy
Im PureBasic-Unterverzeichnis "Compilers" findest Du die Datei PureBasic.asm
cu, helpy
Verfasst: 28.03.2006 10:07
von Deeem2031
Woher soll denn der Compiler wissen das du a und b in der Schleife nicht änderst? -> Es wird jedes mal a+b ausgerechnet.
Re: Schleifen, Compiler und Geschwindigkeit
Verfasst: 28.03.2006 10:11
von DrShrek
Lebostein hat geschrieben:Hi,Meine Frage: Wird bei jedem Schleifendurchlauf die Addition a + b ausgeführt ? Oder wird schon im vorraus a + b gegen einen konstanten Wert ersetzt, da sich ja a und b während der Schleife nicht ändern?
Idealerweise sollte bereits der 'Entwickler' wissen ob es konstante Werte sind und dann natürlich #a bzw #b verwenden.
Oder eben gleich die Zahlen (und dann natürlich bereits ausrechnen)
Wie es der Compiler umsetzt weiss ich nicht (habe ich nicht nachgeschaut)
Verfasst: 29.03.2006 10:44
von Shardik
Der Compiler (PB 3.94) erzeugt folgenden Assembler-Code (Auszug):
Code: Alles auswählen
; a = 20000
MOV dword [v_a],20000
; b = 200
MOV dword [v_b],200
;
; i = a
PUSH dword [v_a]
POP dword [v_i]
; While i < a + b
_While1:
MOV ebx,dword [v_i]
MOV edi,dword [v_a]
ADD edi,dword [v_b]
CMP ebx,edi
JGE _Wend1
; Debug i
; i + 1
INC dword [v_i]
; Wend
JMP _While1
_Wend1:
Das Listing zeigt, daß in der While/Wend-Schleife mit "ADD edi,dword [v_b]" bei jedem Schleifendurchlauf eine erneute Addition von A und B stattfindet, wie die vorherigen Postings ja auch schon vermutet und begründet haben.
Verfasst: 29.03.2006 14:20
von Lebostein
Jo, danke. Habs verstanden und meine Vermutung wurde bestätigt.
Verfasst: 29.03.2006 17:04
von remi_meier
Ich werfe es mal so in die Runde: Andere Compiler können das optimieren.
Verfasst: 29.03.2006 17:14
von DrShrek
remi_meier hat geschrieben:Ich werfe es mal so in die Runde: Andere Compiler können das optimieren.
Würde ich aber als Programmierer nur erlauben, wenn a + b zwei Konstanten wären (= bei PB: Kennung mit '#' z.b: #a + #b).
Was kommt dabei eigentlich raus?
Verfasst: 29.03.2006 17:22
von remi_meier
Na der Compiler kann ganz einfach schauen, ob die Werte in der Schleife
verändert werden, wenn nicht, sind sie konstant für diese Schleife und
die Summe muss nur einmal berechnet werden...
Verfasst: 29.03.2006 17:34
von Lebostein
Dr. Shrek hat geschrieben:wenn a + b zwei Konstanten wären
Was kommt dabei eigentlich raus?
Da führt er die Addition vorher aus, so wie es auch sein sollte:
Code: Alles auswählen
; While i < #a + #b
_While1:
MOV ebx,dword [v_i]
CMP ebx,20200
JGE _Wend1
; Debug i
; i + 1
INC dword [v_i]
; Wend
JMP _While1
_Wend1:
PS: kann man des ASM-Output bzw. -Input standardmäßig einschalten, so dass er immer generiert wird? Kann in der PB-IDE keine Compliereinstellungen finden...