He visto respuestas aquí para idiomas específicos, sobre switches con más de 5 casos optimizados con tablas de salto para garantizar un tiempo de acceso constante para cualquier caso.
¿Eso es así para C/C++?
¿Es en particular para gcc? para el estudio visual?
En caso negativo, ¿ordenaría los casos por orden de frecuencia de ocurrencia ayuda?¿La optimización del interruptor para muchos casos garantiza el mismo tiempo de acceso para cualquier caso? (C++)
Respuesta
La norma no garantiza nada acerca de cómo se implementará la instrucción de conmutación. Nunca he visto un compilador producir una tabla hash, aunque algunos producirán una tabla de salto. A menos que mi memoria funcione peor de lo normal, tanto VS como gcc pueden producir tablas de salto cuando las cajas son suficientemente densas (para diferentes valores de "suficiente"). Desafortunadamente, es casi imposible decirlo (o incluso imaginarlo) cuando la ordenación por frecuencia de aparición ayudará: no solo es diferente entre compiladores, sino incluso entre diferentes versiones del mismo compilador.
Esto es lo que el compilador hará por usted. En el caso de GCC usará una tabla de salto.
- C y C++ no garantizan nada sobre el tiempo de ejecución de las sentencias de conmutación.
- Me temo que no conozco los detalles de implementación para ningún compilador. Probablemente depende de los indicadores de optimización.
- casos de clasificación no está garantizada para ayudar, una vez más no se especifica en la norma, y su aplicación pueden o no:
- hacer cosas diferentes de acuerdo a las opciones del compilador
- documento lo que hace
- Garantizar que no se modifique lo que hace en las versiones futuras
- Ignore por completo el orden de los casos en la fuente y vuelva a pedirlos como prefiera. Suponiendo, por supuesto, que los casos son "independientes": no se producen caídas; no hay declaraciones de variables comenzando en un caso y abarcando otro caso; nada más lo he olvidado.
c (y por extensión C++) solamente se enciende tipos de enteros, por lo hashing no es necesario. El compilador generalmente usará un modismo apropiado para la arquitectura para la que está compilando. Esto podría ser un direccionamiento indexado (si se usa un rango pequeño), tablas de salto, o algo completamente diferente.
Hashing no es necesario, pero ocasionalmente es posible optimizar un montón de casos enteros usando un hash perfecto como índice en una tabla de salto, básicamente tomando un conjunto de números no consecutivos y asignarlos a un espacio consecutivo más rápido de lo que podría atravesar un árbol de decisión binario. Si eso es una optimización que cualquier compilador-escritor puede ser molestado es otra cuestión ... –
@Steve: Voy a tomar su palabra para ello, pero en las arquitecturas que he sabido lo suficiente como para comentar incluso (bastante viejos estos días) una mesa de salto sería uniformemente más rápida. Incluso una tabla de salto de dos niveles para administrar objetivos dispersos en un rango entero grande. – dmckee
La única excepción que podría obtener sería un hash perfecto para un conjunto de banderas binarias. Es decir. si todos los "valores de casos" son potencias de 2. – MSalters
Para la implementación de gcc ver:
http://old.nabble.com/optimization-of-switch-statements-on-i386-to15366926.html#a15367662
Un hash no parece ser una manera eficaz de poner en práctica un interruptor, ya que tendrá fallos de caché adicional debido a las operaciones de búsqueda.
- 1. Acerca del interruptor {} caso en C?
- 2. Interruptor, mismo valor para caja múltiple
- 3. Caso en el interruptor protegido
- 4. ¿Optimización de la declaración de cambio de Java con muchos casos?
- 5. muchos url-pattern para el mismo servlet
- 6. caso del interruptor en C# - se espera un valor constante
- 7. caso interruptor Evitar -linq
- 8. Optimización SQL Declaración de caso
- 9. Agrupando casos de declaración de interruptor juntos?
- 10. Ayuda para comprender la optimización de C#
- 11. casos de uso del mundo real para indexadores de C#?
- 12. ¿La caja del interruptor "predeterminado" altera la optimización de la tabla de salto?
- 13. optimización del acceso a los miembros en C++
- 14. Optimización del pitón código de acceso diccionario
- 15. gama declaración de caso interruptor
- 16. optimización del bucle anidado del compilador para acceso a la memoria secuencial.
- 17. Optimización del tiempo de ejecución de idiomas estáticos: JIT para C++?
- 18. C++ Consejos para la optimización de código en dispositivos ARM
- 19. ¿Cómo ejecutar el mismo caso de prueba para diferentes clases?
- 20. El uso del operador XOR para encontrar elementos duplicados en una matriz falla en muchos casos
- 21. optimización del compilador para la estabilidad numérica
- 22. Herramientas de optimización para C y C++
- 23. Importación muchos casos utilizando MEF
- 24. Caso de uso para LinkedList
- 25. Caso VHDL/Cuando: varios casos, sola cláusula
- 26. C++ múltiples sobrecargas de operador para el mismo operador
- 27. Cualquier equivalente de "extendido" para C#?
- 28. ¿Cómo puedo asignar muchos atributos de Moose al mismo tiempo?
- 29. Sintaxis alternativa para el interruptor
- 30. ¿Reemplazo para interruptor grande?
Parece que haría que C fuera un "asesino a sueldo" si pudieran optimizar una declaración de conmutación bastante bien ... –
Estaría * muy * sorprendido si el hash fuera más rápido para 6 casos. Tal vez para 25. Claro, una tabla hash probablemente reducirá la varianza en el tiempo de acceso, pero lo hace al agregar una sobrecarga fija. – MSalters
Estoy seguro de que comprende que esto solo importa si las ramas de los conmutadores en realidad no hacen mucho, y si la PC está realmente en el conmutador una fracción de tiempo significativa, como 10% o más. De lo contrario, es básicamente ruido cuántico. –