Aktuelle Zeit: 15.10.2018 16:31

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Inline-If
BeitragVerfasst: 06.03.2016 14:37 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Code:
Macro Iif(Expression, TrueValue, FalseValue)
  FalseValue + Bool(Expression) * (TrueValue - FalseValue)
EndMacro

Macro IifS(Expression, TrueString, FalseString, Separator = "|")
  StringField(FalseString + Separator + TrueString, Bool(Expression) + 1, Separator)
EndMacro

Debug IifS(1 = 1, "Ja", "Nein")
Debug IifS(1 = 0, "Ja", "Nein")

Debug Iif(1 = 1, 11, 55)
Debug Iif(1 = 0, 11, 55)

Eine native Implementierung wäre sicherlich performanter...

Hier noch ein Speed-Test:
Code:
CompilerIf #PB_Compiler_Debugger
  CompilerError "Debugger ausschalten!"
CompilerEndIf
; !!!!!!!!! Purifier ebenfalls ausschalten !!!!!!!!!

Macro Iif(Expression, TrueValue, FalseValue)
  FalseValue + Bool(Expression) * (TrueValue - FalseValue)
EndMacro

Macro IifS(Expression, TrueString, FalseString, Separator = "|")
  StringField(FalseString + Separator + TrueString, Bool(Expression) + 1, Separator)
EndMacro

Define.s Result$
Define.i Result, Time, Time_Result_1, Time_Result_2, i

#Rounds = 100000000

Time = ElapsedMilliseconds()
For i = 1 To #Rounds
  Result$ = IifS(1 = 1, "Ja", "Nein")
  Result$ = IifS(1 = 0, "Ja", "Nein")
  Result  = Iif(1 = 1, 11, 22)
  Result  = Iif(1 = 0, 11, 22)
Next
Time_Result_1 = ElapsedMilliseconds() - Time

Time = ElapsedMilliseconds()
For i = 1 To #Rounds
  If 1 = 1 : Result$ = "Ja" : Else : Result$ = "Nein" : EndIf
  If 1 = 0 : Result$ = "Ja" : Else : Result$ = "Nein" : EndIf
  If 1 = 1 : Result = 11    : Else : Result = 22      : EndIf
  If 1 = 0 : Result = 11    : Else : Result = 22      : EndIf
Next
Time_Result_2 = ElapsedMilliseconds() - Time

MessageRequester("", Str(Time_Result_1) + #CRLF$ + Str(Time_Result_2))
Code:
10931
6439

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Zuletzt geändert von Sicro am 07.03.2016 20:46, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 06.03.2016 14:50 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
:allright:

Ich hoffe, dass PB das irgendwann selber kann.

_________________
BildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 06.03.2016 14:57 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Etwas kürzer
Code:
Macro IifS(Expression, TrueString, FalseString)
  Left(TrueString, Bool(Expression) * Len(TrueString)) + Left(FalseString, Bool(Not Expression) * Len(FalseString))
EndMacro

Macro Iif(Expression, TrueValue, FalseValue)
  Bool(Expression) * TrueValue + Bool(Not (Expression)) * FalseValue
EndMacro

Debug IifS(1 = 1, "Ja", "Nein")
Debug IifS(1 = 0, "Ja", "Nein")

Debug Iif(1 = 1, 11, 55)
Debug Iif(1 = 0, 11, 55)

:wink:

_________________
Alles ist möglich, fragt sich nur wie...
Projekte EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 06.03.2016 21:06 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Man sollte auch den Nebeneffekt beachten, dass "Expression" zweimal ausgeführt wird. Falls Expression eine Funktion ist, wird diese dann auch zweimal ausgeführt, was oftmals nicht gewünscht ist.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 16.04.3 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 06.03.2016 22:33 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
@NicTheQuick:
Da hast du recht. Ich habe meinen Code durch eine bessere Version ersetzt. Nun wird die "Expression" immer nur einmal ausgeführt.
Ein Trennzeichen wollte ich eigentlich weglassen, weshalb ich bei der ersten Code-Version auf StringField() verzichtet habe, aber nun habe ich keine andere Wahl.

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 07.03.2016 00:14 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Ist nicht böse gemeint, aber wie ich im englischen Forum schon schrieb, halte ich nichts von diesen Inline-If Sachen (zumindest nicht in diesem selbstgemachten Zustand).
Speziell geht es um die Problematik, dass beide Zustände (True und False) immer ausgeführt werden, was in diesem Fall z.B. zu Problemen führt:
Code:
Macro Iif(Expression, TrueValue, FalseValue)
  Bool(Expression) * TrueValue + Bool(Not (Expression)) * FalseValue
EndMacro

Define x.f

x.f = 2.0
Debug Iif(x<>0, 1/x, 0)

x.f = 0.0
Debug Iif(x<>0, 1/x, 0) ; sollte 0 zurückgeben

Probleme gibt es auch mit einer Prozedur, welche die Arithmetik umgeht:
Code:
Procedure.f Iif_(Query, True.f, False.f)
   If Query
      ProcedureReturn True
   Else
      ProcedureReturn False
   EndIf
EndProcedure

Macro Iif(Expression, TrueValue, FalseValue)
  Iif_(Bool(Expression), TrueValue, FalseValue)
EndMacro

Define x.f

x.f = 2.0
Debug Iif(x<>0, 1/x, 0)

x.f = 0.0
Debug Iif(x<>0, 1/x, 0)
Hier bekommt man sofort die Fehlermeldung, dass nicht durch Null geteilt werden darf, weil eben beide Parameter ausgeführt werden.

Darum hier meine Bitte, doch bitte lieber auf eine echte Implementierung zu warten, statt "unechte" Tricks zu posten.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 07.03.2016 08:42 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
@Stargate:
Ich finde nicht, dass das was Du schreibst generell gegen das Verwenden von selbstgemachtem "Inline-If" spricht. Auch wenn man das normale "If" benutzt darf man nicht durch 0 dividieren. Ja, da gibt es zwar in PB die Kurzschlussauswertung, aber auch dabei muss man wissen was man macht.

@Sicro:
Danke für diese Vorschläge!
Die numerischew Version lässt sich noch etwas vereinfachen, indem man auf das "Not" verzichtet, und da du in der String-Version für das Trennzeichen eine Variable benutzt, muss es natürlich überall als Variable auftauchen. :-)

//edit: evtl. missverständliche Formulierung geändert

Code:
Macro Iif(Expression, TrueValue, FalseValue)
   FalseValue + Bool(Expression) * (TrueValue - FalseValue)
EndMacro

Macro IifS(Expression, TrueString, FalseString, Separator = "|")
   StringField(FalseString + Separator + TrueString, Bool(Expression) + 1, Separator)
EndMacro

_________________
Dieser Satz ist falsch.


Zuletzt geändert von Nino am 07.03.2016 09:15, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 07.03.2016 09:03 
Offline
Benutzeravatar

Registriert: 11.01.2009 16:30
Wohnort: Langerringen
Im einem anderen Thread (http://purebasic.fr/german/viewtopic.php?f=8&t=4840&start=10) hatte ich schon mal meine Variante gepostet. Total simpel, dafür nicht komplett Inline, weil die Result Variable mit als Paramter übergeben werden muss... dafür ohne Performanceverlust, doppelter Ausführung der Expression... ist ja schließlich nur ein simples If : Else :lol:

Code:
Macro If_set(Result, Expression, TrueValue, FalseValue)

  If Expression
    Result = TrueValue
  Else
    Result = FalseValue
  EndIf

EndMacro

Define a.s, b.i

If_set(a, 1 = 1, "Ja", "Nein") : Debug a
If_set(a, 1 = 0, "Ja", "Nein") : Debug a

If_set(b, 1 = 1, 11, 55) : Debug b
If_set(b, 1 = 0, 11, 55) : Debug b


Auch wenn ich gerne komplizierte Sachen mache, in dem Fall finde ich einfacher ist smarter :)
Eine nativle Implementation komplett inline wäre mich aber auch sehr recht...

_________________
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 07.03.2016 09:13 
Offline
Benutzeravatar

Registriert: 13.07.2005 08:39
Ich finde Stargate hat im Prinzip recht. Wenn es doch aber Spaß macht ... :)
Außerdem weiß man nie was raus kommt solange man es nicht probiert.

Gestern ist Ray Tomlinson gestorben.
Ich möchte nicht wissen was seine Zeitgenossen damals dachten als er die E-Mail erfand.

Wenn es möglich ist mit festen Ergebnissen zu arbeiten kann man auch ein Array oder Konstanten verwenden.
Irgendwo habe ich gelesen, dass Konstanten schneller als Variablen seien.
Wenn man die Reihenfolge der Messungen ändert, ändert sich aber auch das Ergebnis.

Code:
CompilerIf #PB_Compiler_Debugger
  CompilerError "Debugger ausschalten!"
CompilerEndIf
; !!!!!!!!! Purifier ebenfalls ausschalten !!!!!!!!!

Define.s Result$
Define.i Result, Time, Time_Result_1, Time_Result_2, Time_Result_3, i

#Rounds = 100000000

Dim ResultArray(1)
ResultArray(0) = 11
ResultArray(1) = 22
#T=11
#F=22

Macro Iif(Expression, TrueValue, FalseValue)
  TrueValue + Bool(Not (Expression)) * (FalseValue - TrueValue)
EndMacro

Macro IifA(Expression)
  ResultArray(Bool(Expression))
EndMacro

Macro IifK(Expression)
  #T + Bool(Not (Expression)) * (#F - #T)
EndMacro


x.f = 0.0
MessageRequester("", Str(Iif(x<>0, 1/x, 11)) + #CRLF$ + Str(IifA(x<>0))+ #CRLF$ + Str(IifK(x<>0)))


Time = ElapsedMilliseconds()
For i = 1 To #Rounds
  Result  = Iif(1 = 1, 11, 22)
  Result  = Iif(1 = 0, 11, 22)
Next
Time_Result_1 = ElapsedMilliseconds() - Time

Time = ElapsedMilliseconds()
For i = 1 To #Rounds
  Result = IifA(1 = 1)
  Result = IifA(1 = 0)
Next
Time_Result_2 = ElapsedMilliseconds() - Time

Time = ElapsedMilliseconds()
For i = 1 To #Rounds
  Result = IifK(1 = 1)
  Result = IifK(1 = 0)
Next
Time_Result_3 = ElapsedMilliseconds() - Time

MessageRequester("", Str(Time_Result_1) + #CRLF$ + Str(Time_Result_2)+ #CRLF$ + Str(Time_Result_3))


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Inline-If
BeitragVerfasst: 07.03.2016 12:19 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
@Nino:
>> "Auch wenn man das normale "If" benutzt darf man nicht durch 0 dividieren."
Richtig, aber beim normalen If, frage ich das ja vorher auch ab, ob x<>0 und lasse dann nur 1/x zu!
Bei deinem Inline-If wird das 1/x leider in jedem Fall ausgeführt.

@mhs:
Deine Variante ist wiederum nicht Inline, somit scheiden Zuweisungen und arithmetische Verschachtelungen aus.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye