Guten Abend, heute geht es mir um eine, so nehme ich an, eher einfache Frage. Ich würde gerne, nicht aus tatsächlichem Erfordernis sondern eher aus Neugierde, wissen ob:
weniger Performance verbraucht als:
Da ich gehört habe da If/Then/Else-Vergleiche immer sehr aufwendige aktionen seien, zumindest relativ gesehen.
Ich Danke hier schon einmal im Vorraus allen die bereit sind zu antworten.
Cornix.
also als erstes muss man sagen, dass die funktionen nicht dasselbe ergebnis liefern.
in der ersten erhält die variable immer einen der werte von p.x-320, 0 oder $map.width*32-640
in der zweiten version hingegen erhält die variable nur den wert p.x-320, dafür jedoch nicht immer.
zur performance lässt sich zur ersten version sagen, dass auch sie intern if-etc-vergleiche anwendet. also ist die aufwendigkeit eher irrelevant. diese vergleiche sind aber vermutlich schneller als in der 2. version, da sie in c geschrieben wurden.
jedoch wird dieser unterschied meiner meinung nach wieder zunichte gemacht, da 2 arrays erstellt werden müssen und in die variable immer ein wert geschrieben wird.
die zweite version dürfte (leicht verändert mit der between methode) schneller sein.
das ist eigentlich genau dasselbe wie deine version, nur dass die if vergleiche intern in c ausgeführt werden (bin mir nicht sicher - vlt is die methode auch in ruby geschrieben worden) und somit leicht schneller sind.
zudem wird kein kein array erzeugt und die variable muss auch nicht immer neu geschrieben werden.
letztenendes dürfte es aber keinen großen unterschied machen, welche der 3 versionen du vorziehst.
falls es dir dennoch wichtig ist, mach ne schleife, in der jede version ein paar tausen mal durchgeführt wird und vergleich am ende die zeiten.
dann hast du nämlich ein 100%ig richtiges ergebnis.
meins sind nämlich nur vermutungen.
letztenendes dürfte es aber keinen großen unterschied machen, welche der 3 versionen du vorziehst.
...
Ich will das nochmal unterstreichen!
Es ist wirklich vollkommen egal, welche der beiden Varianten du nimmst. Wenn du dein Programm optimieren willst, dann an Stellen die wirklich Performance kostet. So Sachen wie einen zweielementigen Array erzeugen oder eine mehrfach verschachtelte if-Schleife kannst du auch hunderttausend Mal ausführen ohne das die Framerate sich ändert.
Wenns um Performance geht ist das wichtigste: Wie oft wird ein Code ausgeführt. Schau dir Schleifen und rekursive Funktionen an. Wenn diese sehr oft (und oft heißt: mehrere hundert bis tausend Mal) pro Frame ausgeführt werden, kannst du auch ihren Inhalt angucken. Und selbst dann ist nicht relevant, ob da eine max Funktion oder ein If-Satz verwendet wird, sondern eher ob du unnötige Rechenzweige drinne stehen hast, die du auch ins äußere der Schleife verlegen könntest, oder ob du mehr Schleifen/Funktionsaufrufe verwendest, als du eigentlich bräuchtest.
Da es ja eine reine Interessensfrage ist:
Ich behaupte mal der zweite Teil (If-Abfrage) ist schneller.
Es ist natürlich möglich, daß Ruby die Max- und Min-Aufrufe im ersten Teil in If-Konstrukte intern zwecks Optimierung umwandelt, aber wenn wir nicht von so einer schlauen Optimierung ausgehen, ist der erste Code aufwendiger.
Im zweiten Teil haben wir 1 Zuweisung, 2 Vergleiche und eine boolsche Operation. Das alles sind Kernelemente der Sprache, die sich ziemlich direkt nach C abbilden lassen (in der der Ruby-Interpreter geschrieben ist).
Im ersten Teil haben wir 2 verschachtelte Arrays. Das bedeutet Ruby wird vermutlich erst einmal Array-Objekte erzeugen, wofür er Speicher reservieren muss. Dann haben wir zwei Methodenaufrufe, das bedeutet Nachschlagen in der Funktionstabelle der Array-Klasse und einen geringen Overhead durch den Aufruf (Rücksprungadresse, lokale Variablen).
Die Frage ist ob die min- und max-funktionen, die ja mit beliebig großen Arrays funktionieren, spezielle Implementierungen für 2-Elementige Arrays haben, wo dann eine einfache If-Abfrage ausreicht. Falls nicht, beinhalten die Aufrufe Schleifen-Konstrukte, die ein wenig aufwendiger sein könnten als eine reine If-Abfrage.
Man darf nicht vergessen, If-Konstrukte gibt es in so gut wie jeder Programmiersprache, Objekte und Methodenaufrufe nur in Objektorientierten Sprachen - und OOP-Sprachen sind in der Regel immer langsamer als prozuderale Sprachen. Das erzeugen und verwalten von Objekten und der Aufruf von Methoden hat also immer gewisse Kosten, die eine If-Abfrage nicht hat.