Behandlung von Booleans

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Behandlung von Booleans

Beitrag von jear »

Code: Alles auswählen

a = 10
Debug (30<40) ; Ergebnis 1
Debug (40<30) ; Ergebnis 0
Debug (a<30)  ; Ergebnis 30, erwartet 1
Debug (a>30)  ; Ergebnis 30, erwartet 0
Die Ergebnisse sind verblüffend.
Dies ist bestimmt schon hier diskutiert worden.
Wird sich PB in dieser Hinsicht ändern ?
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Man kann imo derzeit nur konstante Werte so vergleichen. Variablen werden vielleicht noch folgen, wer weiß?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich wiederhole mich: sollten sie (bitte). das effektivste einsatzgebiet für boolesche ausdrücke ist nunmal der einsatz mit variablen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Lars
Beiträge: 347
Registriert: 31.08.2004 23:53
Wohnort: Shanghai
Kontaktdaten:

Beitrag von Lars »

Nimmt man halt erstmal ne If Abfrage, obwohl Boolsche Ausdrücke
natürlich schon sexy sind :)
Lars
The only problem with troubleshooting is, that sometimes the trouble shoots back.
P4 2,6Ghz, 512MB RAM, GeForce 6200, WinXP Pro SP2, PB V3.94
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nicht nur sexy, sondern auch x-mal schneller.
(war jedenfalls in anderen sprachen so, vielleicht ist PB da ja ne ausnahme :?:)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10719
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:nicht nur sexy, sondern auch x-mal schneller.
(war jedenfalls in anderen sprachen so, vielleicht ist PB da ja ne ausnahme :?:)
Wunder gibt es immer wieder.

In VB ist es zumindest so, daß beispielsweise ein Select-Case schneller ist als
eine If-Else-Endif-Abfrage. In PB ist es genau umgekehrt. Ebenso verhält es
sich mit "If Len(String)=0", welches in VB schneller ist als die If String = "" -
Abfrage.

Code: Alles auswählen

Enumeration
  #LIG
EndEnumeration

Procedure Test1()
  
  sDummy.s = "Hallo"
  
  z1 = ElapsedMilliseconds()
  For lCounter =0 To 10000000
    If sDummy = ""
      lDummy = 1
    EndIf
  Next 
  z2 = ElapsedMilliseconds()
  
  ; -------------
  AddGadgetItem(#LIG,-1,"If String = " + Chr(34) + Chr(34) + #LF$ + Str(z2-z1))
  ; -------------
  
  z1 = ElapsedMilliseconds()
  For lCounter =0 To 10000000
    If Len(sDummy) = 0
      lDummy = 1
    EndIf
  Next 
  z2 = ElapsedMilliseconds()
  
  ; -------------
  AddGadgetItem(#LIG,-1,"If Len(String) = 0" + #LF$ + Str(z2-z1))
  ; -------------
  
  
EndProcedure

Procedure Test2()
  
  z1 = ElapsedMilliseconds()
  For lCounter =0 To 10000000
    If Sqr(2)=1
    ElseIf Sqr(2)=2
    ElseIf Sqr(2)=3
    ElseIf Sqr(2)=4
    ElseIf Sqr(2)=5
    EndIf
  Next 
  z2 = ElapsedMilliseconds()
  
  ; -------------
  AddGadgetItem(#LIG,-1,"If Else Endif" + #LF$ + Str(z2-z1))
  ; -------------
  
  z1 = ElapsedMilliseconds()
  For lCounter =0 To 10000000
    Select Sqr(2)
      Case 1
      Case 2
      Case 3
      Case 4
      Case 5
    EndSelect
  Next 
  z2 = ElapsedMilliseconds()
  
  ; -------------
  AddGadgetItem(#LIG,-1,"Select Case" + #LF$ + Str(z2-z1))
  ; -------------
  
EndProcedure


If OpenWindow(0,0,0,230,100,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Kleinen Augenblick Geduld...") 
  
  If CreateGadgetList(WindowID()) 
    ListIconGadget(#LIG, 10, 10, 210, 80, "Aktion", 150, #PB_ListIcon_GridLines) 
    AddGadgetColumn(#LIG,1,"Zeit",50) 
  EndIf 
  
  Test1()
  Test2()
  
  SetWindowTitle(0,"Kleiner Performance-Test")
  
  Repeat 
    EventID = WaitWindowEvent() 
  Until EventID = #PB_Event_CloseWindow 
  
EndIf 
kann aber auch sein, daß ich mich da verhauen habe...

Grüße ... Kiffi
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hmmm, interessant.

ich kann ja leider nicht austesten, ob booleans schneller sind.
um es mal zu verdeutlichen (ich wiederhole mich):

x-koordinaten-begrenzung für 32er Sprite auf 800er screen (auftauchen gegenüber)

Sx = Sprite-X , vx = X-Geschwindigkeit

klassisch (funktioniert):

Code: Alles auswählen

Sx + vx
If Sx < -32 : Sx + 832 : EndIf
If Sx > 800 : SX - 832 : EndIf
und mit Booleans (funktioniert NICHT):

Code: Alles auswählen

Sx + vx + 832*(Sx<-32) - 832*(Sx>800)
anmerkung: die Beiden Codes sind wahrscheinlich nicht wirklich identisch, da beim zweiten möglicherweise das Sx ohne vx in die abfrage einfliessen würde (was bei C anders wäre)

in C wäre der zweite Code merklich schneller.

mal die Frage ans TEAM: wäre das in PB auch schneller, wenn man variablen in booleans verwenden könnte ?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

@Kaeru: kann die Frage leider nicht selbst beantworten. Habe Fred angeschrieben und um Rückinfo gebeten. Melde mich dann mit mehr Infos... :)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

danke, andre

mir gehts halt darum:

wenn es wirklich schneller wäre, plädiere ich dafür, es zu implementieren. :allright:

wenn es langsamer wäre, kann fred sich die arbeit sparen, dann werden halt weiterhin IFs gesetzt. :cry:

wenn es gleichschnell wäre, wäre es schon interessant, zumindest um einen modernen C-like-style zu ermöglichen :wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Beitrag von jear »

Vor allen Dingen sollte die Logik stimmen und der Code keinen Unsinn produzieren.
Wenn der Ausdruck (b<60) die 60 als Ergebnis zurückgibt, dann ist das meiner Meinung nach schlicht falsch.
Entweder muss dann der Compiler solche Konstruktionen unterbinden, oder aber das tun, was er bei der If - Abfrage auch tut, den Ausdruck richtig nach True oder False auflösen.
In diesem Zusammenhang fällt mir eine Diskussion aus dem englischen Forum ein, bei der es um das Setzen von Defaults für Prozedurparameter geht. Dort wird ernsthaft diskutiert, dafür die Syntax ProcName(a.l , b = 3, c.w) auszuwählen.
Ist aber b = 3 nicht auch ein boolescher Wert?

Abgesehen von Geschwindigkeitsvorteilen, ich finde

Code: Alles auswählen

SetGadgetState(#Gadget, (Z>45))
einfach besser als

Code: Alles auswählen

If Z > 45
  SetGadgetState(#Gadget, #True)
Else
  SetGadgetState(#Gadget, #False)
Endif
Antworten