Es hängt vielmehr davon ab, was die Codes sind und wie viele es sind. Gute Compiler haben verschiedene Tricks, um Switch-Anweisungen zu optimieren, von denen einige nicht mit geraden if/then-Anweisungen verwendet werden. Die meisten sind hell genug, um einfache Mathematik zu machen oder Such-/Sprungtabellen für Fall 0, 1, 2 oder Fall 3, 6, 9 zum Beispiel zu verwenden.
Natürlich einige nicht, und viele werden leicht durch ungewöhnliche oder unregelmäßige Mengen von Werten vereitelt. Auch wenn der Code für die Bearbeitung mehrerer Fälle sehr ähnlich aussieht, kann das Ausschneiden und Einfügen zu Wartungsproblemen führen.Wenn Sie viele Codes haben, aber sie können algorithmisch in Gruppen unterteilt werden, könnten Sie zum Beispiel mehrere/geschachtelte Switch-Anweisungen, betrachten anstatt:
switch (code) {
case 0x0001: ...
case 0x0002: ...
...
case 0x8001: ...
case 0x8002: ...
...
}
Sie verwenden könnten:
if (code & 0x8000) {
code &= ~0x8000;
switch (code) {
case 0x0001: ... // actually 0x8001
case 0x0002: ... // actually 0x8002
...
}
}
else {
switch (code) {
case 0x0001: ...
case 0x0002: ...
...
}
}
Viele Sprachdolmetscher dekodieren Opcodes auf diese Weise, da ein Ein-Byte-Opcode zusätzliche Information haben kann, die in verschiedene Bits gepackt ist, und alle möglichen Kombinationen transkribiert werden, und ihre Handler würden sich wiederholend und zerbrechlich sein. Auf der anderen Seite kann übermäßiges Bit-Mangling jegliche Optimierung durch den Compiler verhindern und kontraproduktiv sein.
Wenn Sie nicht sicher sind, dass dies ein echter Leistungsengpass ist, würde ich eine vorzeitige Optimierung vermeiden: Tun Sie es, wie es Ihnen als einigermaßen robust und schnell zu implementieren erscheint. Wenn Ihre Anwendung zu langsam läuft, profilieren Sie sie und optimieren Sie sie entsprechend.
'Wert = 5 * (Code + 1);' – kennytm
@KennyTM - Ausgezeichnet. Außer es gibt nicht die tatsächlichen Werte ... – Rachel
+1 für eine interessante Frage. –