2010-10-22 18 views
7

¿Alguien sabe si el boost::get para el boost::variant es una operación que consume rendimiento o no.C++ - boost obtener pregunta

En este momento estoy refactorización algún código de edad en una parte rendimiento crítico, donde "varianting" estaba ejecutando por contenedores para cada posible tipo y la correspondiente enum.

Obviamente, esto es rápido, pero feo y ahora cuando tengo que refactorizar el código para que se trabajaría con un tipo más, que quieren deshacerse de la parte antigua de código y reemplazarlo con boost::variant .

Además, no puedo simplemente "perfilar ambas variantes y comparar" porque esta refactorización es un dolor en el culo y me llevaría bastante tiempo.

Por lo tanto, si alguien sabe cómo se comporta el boost::get<x> en comparación con el envío genérico de tipo enum-based, le agradecería si comparte este conocimiento.

Hay otra variante de la utilización de boost::variant<types> con usuario personalizado (como se describe en la documentación boost::variant) - puede ser más rápido que este boost::get en mi caso?

Gracias.

+0

¿Has probado mirar el código fuente? http://www.boost.org/doc/libs/1_44_0/boost/variant/get.hpp – Wernight

+0

Si una operación _custom_ fuera más rápida que la suya, ¿no basarían su propia implementación en la implementación personalizada? – sbi

+0

¿Finalmente eligió 'void *'? – DarioP

Respuesta

4

Aún podría escribir una aplicación de prueba simple para comparar los dos, no tiene que ser el entorno de producción.

Un colega mío tuvo un problema similar al suyo recientemente. En su escenario, había objetos de diferentes tipos, pero siempre supo de antemano qué tipo esperaba. También su estructura de datos era enorme, así que la memoria era un problema. Él resolvió el problema usando void * y reinterpret_cast. Esto evita la sobrecarga de memoria del polimorfismo y es muy rápido. Sin embargo, debes estar absolutamente seguro de lo que estás haciendo, de lo contrario las cosas explotarán.

3

Al observar el código, get<> se implementa utilizando el mecanismo de visitante interno de boost::variant. A su vez, el mecanismo de visitante se basa en las secuencias mpl, y se ejecuta paso a paso. Esto significa como máximo n pasos en una variante de tipo n, pero el bucle (llamada recursiva) está allí. Nuevamente, como sugiere Space Cowboy, una pequeña prueba de desempeño sería útil.

+0

¿Quiere decir que tomaría más tiempo acceder al último de los tipos enumerados que el primero? Una prueba rápida muestra que este no parece ser el caso. ¿Estás seguro de que la recursión no es en tiempo de compilación? – UncleBens

+0

UncleBens: mirándolo dos veces, la búsqueda se desenrolla hasta un límite determinado (por lo que he visto es el límite de tamaño de la lista de mpl real, lo que sea). Entonces, la llamada es recursiva. Así que sí, tal vez hasta 10 tipos más o menos no hay una llamada recursiva, pero nuevamente, como dices, nada mejor que una pequeña prueba. –