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

Code: Alles auswählen

PBCompiler.exe source.pb /COMMENTED /EXE exename.exe
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...