5 Stimmen

Ist die ternäre Operation in iPhone besser als "if/else"?

Ich habe diesen Block in meinem Programm:

if (x > 0) {
    a = 1;
    b = 4;
} else {
    a = 2;
    b = 3;
}

Dies kann mit einer ternären Operation wie folgt geschrieben werden:

a = (x > 0) ? 1 : 2;
b = (x > 0) ? 4 : 3;

Die Ergebnisse sind äquivalent, aber es handelt sich um einen wirklich kritischen Teil meiner Anwendung, der tausende Male pro Sekunde ausgeführt wird. Ich möchte einige Mikrosekunden einsparen, da diese Methode ein wenig wachsen wird.

Meine Frage: Auf ARM-Ebene, welche ist schneller? Ich glaube, dass der erste eine Branch-Anweisung erzeugt. Aber wie sieht es mit der ternären Operation aus? Wird diese auf dem iPhone auch zu einem Branch? Oder hat der ARM des iPhone ein böses Opcode, um die Arbeit zu erledigen?

Übrigens, ich habe auch eine böse Technik wie diese gesehen:

a = (x > 0) * 1 + (x <= 0) * 2;

Ist das wirklich schneller?

0voto

MoDJ Punkte 4198

Es wird keinen Unterschied geben, gcc wird ein einfaches if und ein ternärer Operator in den gleichen Code kompilieren. Wenn Sie wirklich versuchen, Ihren Code auf ARM-Assembler-Ebene zu optimieren, ist es möglich, signifikante Geschwindigkeitsverbesserungen zu erzielen, indem Sie bedingten ARM-Assemblercode verwenden, um Verzweigungen zu vermeiden. Aber dazu müssen Sie Ihren Code profilieren und herausfinden, wo er wirklich benötigt wird. Dann müssten Sie ARM-Assemblercode nur für die Hotspots in Ihrem Code von Hand schreiben. Grundsätzlich, wenn Sie keine extremen Leistungsverbesserungen benötigen, verwenden Sie einfach die vom Compiler bereitgestellten Funktionen, da der Compiler in den meisten Fällen gute Arbeit leistet.

-1voto

jcpennypincher Punkte 3872

Geh für Lesbarkeit, du bist kein Compiler

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X