Lieber Ternary oder normales If?

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Tag,


    ich würde mal gerne wissen wo bei den Ternary operationen der nachteil liegt.
    Habe heute nacht mit jemand aus dem IRC einen Geschwindigkeitstest durchgeführt.
    Dieser hat folgendes bei einer for schleife bis 1.000.000 ergeben:

    Code
    Time Ternary:  36
    Time Normal: 37


    Nun wieso sollte ich nun nicht immer mit Ternary arbeiten anstatt If?
    Wenn man die Übersicht einmal hat dürfte das ja nicht das Problem sein.
    Oder ist das Ternary Ressourcenfressender?
    Würde da gerne ein paar Antworten haben.
    Danke

  • Ich vermute das hängt stark vom Zweck ab. Bei größeren Anweisungsblöcken kommst du mit Ternary eh nicht weit und auch sonst sieht if (mMn) einfach übersichtlich aus.


    Die Zeitmessung da oben beweist wenig, IF und ternary bis 10.000.000 bei dem selben Code testen, das ganze 30x machen und dann den Durchschnitt bilden wäre interessanter.


    Ich persönlich vermute, dass es als Maschinencode eh ein und dasselbe ist, daher sollte es eigentlich gleich schnell sein. ;)

  • Nun gut,klar wenn ich nun aber nur 2Abfragen habe anstatt 4-5 kann man ja eigentlich Ternary dann verwenden oder nicht?
    Ich mein solange man sich in seinem eigenen Script auskennt reicht es ja.


    Die frage ist halt auch ist, soll ich dies eher nur ein einer Funktion aufrufen oder in einem abfrage.
    Sprich:return (_a == _b)?(print("A und B sind gleich"):(print("A und B sind ungleich"));
    Oder dann in einer Abfrage:
    if(strcmp("/drivein", cmdtext, true) == 0)
    {
    return (!IsPlayerInRangeOfPoint(playerid,5.0,1871.2880,2102.8982,10.5449) ? (SendClientMessage(playerid,COLOR_RED,"Du bist nicht beim DriveIn")):
    (GetPlayerState(playerid)!=PLAYER_STATE_DRIVER ? (SendClientMessage(playerid,COLOR_RED,"Du bist kein Fahrer")):
    (SendClientMessage(playerid,COLOR_RED,"Willkommen im DriveIn"),SendClientMessage(playerid,COLOR_RED,"Ihr Bestellung bitte"),pDriveIN[playerid] = 1)));
    }

  • Die frage ist halt auch ist, soll ich dies eher nur ein einer Funktion aufrufen oder in einem abfrage.


    Was du da machst sind alles Abfragen aber du führst danach Funktionen aus. Darum verstehe ich diese Frage nicht.


    Ich selber nutze den Operator eigentlich nur für Wert oder String Zuweisungen, weil ich mir dadurch umständliches if und else spare.
    Im Grunde genommen ist das "normale" if und else bei mehreren identischen Abfragen schneller.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Wie ich bereits im IRC sagte, werden Ternary-Abfragen gerne auch als Inline-Abfragen (Inline-IF) bezeichnet und genau das ist ihr Sinn und größter Vorteil.
    // Ternary sinnvoll
    new bool:test;
    SendClientMessage(playerid, Farbe, (test) ? ("true") : ("false")); // Sendet true an den Spieler, wenn test wahr ist, andernfalls false

    Für größere Abfragen, wie bereits von BlackAce und BloodyEric erwähnt, lohnt sich ein Ternary nicht mehr, da er wie eine normale Abfrage agiert.

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

  • Aber kann mir jemand erklären warum sowas nicht möglich ist?
    new bool:test,teststring1[5]="false",teststring2[4]="true";
    SendClientMessage(playerid, Farbe, (!test) ? (teststring1) : (teststring2));
    Ich bekomm dann immer nen error in der SCM Zeile.
    Das Beispiel ist zwar Blöd gewählt aber es erfüllt seinen Zweck :D

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ich würde mal behaupten, dass teststring1 und teststring2 zu klein sind, denn false hat 5 Zeichen, doch die Arraygröße für Strings ist immer Länge+1 (Identifier), das selbe gilt bei true.

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

  • Ich hab doch gesagt das beispiel ist Blöd gewählt.new bool:test,teststring1[10]="false",teststring2[10]="true";
    SendClientMessage(playerid, Farbe, (!test) ? (teststring1) : (teststring2));
    so jetzt einmal für dich mit zu großen strings...

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Getestet und folgende Ausgabe.

    Code
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase


    Es wäre vielleicht sinnvoll, uns mal den Error mitzuteilen.

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Eben den Test nochmal mit 100.000.000 durchgeführt und das ist das Ergebnis:

    Code
    Durchgang 	Ternary		Normal
    1		2906		3542
    2		2924		3534
    3		2907		3544
    4		2922		3540


    Wenn sich nun schon bei 4 Durchgängen ein solch riesiger Unterschied aufzeigt, wird sich das mit mehr Durchläufen nicht ändern. Interessant zu wissen wäre allerdings, wie sich viel Code innerhalb eines Ternaries und einer normalen Abfrage verhält, da beim Test nur eine Variable geändert wurde.

    Moderator der Bereiche: Coding, Vorstellungsrunde und Handelsecke. Über Verwarnungen, falls du zu den Wenigen gehörst, die eine Verwarnung von mir erhalten haben, kannst du jederzeit mit mir reden, sofern der Umgangston stimmt.


    expect us. / unkompetent. Das neue dynamisch. / easy-stripping.net - coming soon! / "9§. the entire website bestands out of english." / Vollprofi in allem, wo gibt und noch mehr; kann auch OOP.
    Kleine Coding-Frage? Schau doch in #dev im IRC vorbei, wir können dir sicher helfen.


    Ich bin für Aufträge im Bereich der Webentwicklung (z.B. User Control Panel) zu haben. Kontaktiere mich diesbezüglich einfach in einer privaten Nachricht mit deinen, möglichst konkreten, Vorstellungen.


    lesen.denken.posten. - [22:54:14] <Goldkiller2> früher gabs immer so coole user da stand in der signatur "lesen.denken.posten."


    Mafia 2 Multiplayer (m2mp.de) - Eine kostenlose Modifikation für Mafia 2, die es, ähnlich wie SAMP, erlaubt über das Internet oder LAN mit bis zu 1000 anderen Spielern zu spielen.