Schleifen, Compiler und Geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Schleifen, Compiler und Geschwindigkeit

Beitrag 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?
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag 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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Schleifen, Compiler und Geschwindigkeit

Beitrag 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)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag von Lebostein »

Jo, danke. Habs verstanden und meine Vermutung wurde bestätigt.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Ich werfe es mal so in die Runde: Andere Compiler können das optimieren.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag 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?
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag 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...
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Beitrag 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...
Antworten