Se más bien depende de cuáles son los códigos y cuántos hay. Los buenos compiladores tienen varios trucos que utilizan para optimizar las sentencias de cambio, algunas de las cuales no emplearán con enunciados directos si/entonces. La mayoría son lo suficientemente brillantes como para hacer cálculos simples o usar tablas de búsqueda/salto para los casos 0, 1, 2 o 3, 6, 9, por ejemplo.
Por supuesto que algunos no lo hacen, y muchos se frustran fácilmente con conjuntos de valores inusuales o irregulares. Además, si el código para manejar varios casos se ve notablemente similar, cortar y pegar puede ocasionar problemas de mantenimiento.Si usted tiene muchos códigos, pero se pueden dividir de forma algorítmica en grupos, es posible considerar varios/anidada sentencias switch, por ejemplo, en lugar de:
switch (code) {
case 0x0001: ...
case 0x0002: ...
...
case 0x8001: ...
case 0x8002: ...
...
}
Es posible utilizar:
if (code & 0x8000) {
code &= ~0x8000;
switch (code) {
case 0x0001: ... // actually 0x8001
case 0x0002: ... // actually 0x8002
...
}
}
else {
switch (code) {
case 0x0001: ...
case 0x0002: ...
...
}
}
Muchos intérpretes de lengua decodifican Opcodes de esta manera, ya que un código de operación de un solo byte puede tener información adicional empaquetada en varios bits, y la transcripción de todas las combinaciones posibles y sus manejadores sería repetitiva y frágil. Por otro lado, el exceso de manipulación de bits puede vencer cualquier optimización por parte del compilador y ser contraproducente.
A menos que esté seguro de que se trata de un cuello de botella de rendimiento real, evitaría una optimización prematura: hágalo de cualquier manera que le parezca razonablemente robusta y rápida de implementar. Como y si su aplicación se ejecuta muy lentamente, perfórela y optimícela según corresponda.
'value = 5 * (código + 1);' – kennytm
@KennyTM - Excelente. Excepto que no hay valores reales ... – Rachel
+1 para una pregunta interesante. –