c++ - Cambiar de Microsofts STL a STLport
windows visual-studio (8)
Antes de realizar el cambio, asegúrese de probar la biblioteca MS (de hecho, Dinkumware) con los iteradores marcados desactivados. Por algún extraño motivo, se activan por defecto incluso en versiones de lanzamiento y eso hace una gran diferencia en lo que respecta al rendimiento.
Estoy usando bastante STL en el código crítico de C ++ en Windows. Una posible forma "barata" de obtener un rendimiento adicional sería cambiar a una biblioteca STL más rápida.
Según este post, STLport es más rápido y usa menos memoria, sin embargo tiene algunos años.
¿Alguien ha hecho este cambio recientemente y cuáles fueron tus resultados?
En un proyecto en el que trabajé que hace bastante uso de stl, cambiar a STLport resultó en hacer las cosas en la mitad del tiempo que tomó con la implementación de STL de Microsoft. No es una prueba, pero es una buena señal de rendimiento, supongo. Creo que se debe en parte al avanzado sistema de administración de memoria de STLport.
Recuerdo haber recibido algunas advertencias al hacer este cambio, pero nada que no se solucionara rápidamente. Como inconveniente, agregaría que la depuración con STLport es menos fácil con el depurador de Visual Studio que con el STL de Microsoft (Actualización: parece que hay una manera de explicarle al depurador cómo manejar los contenedores de STLport, ¡gracias Jalf!).
La última versión data de octubre de 2008, por lo que aún hay personas trabajando en ella. Mira aquí para descargarlo.
He hecho exactamente lo contrario hace un año y he aquí por qué:
- StlPort se actualiza muy raramente (por lo que sé que solo un desarrollador está trabajando en él, puedes echar un vistazo a su historial de confirmaciones)
- Problemas al compilarlo cada vez que cambia a la nueva versión de Visual Studio. Esperas el nuevo archivo make o lo creas tú mismo, pero a veces no puedes compilarlo debido a alguna opción de configuración que estás usando. Luego esperas a que lo construyan.
- Cuando envía un informe de error, espera por siempre, así que básicamente no hay soporte (tal vez si paga). Por lo general, terminas arreglándote tu mismo, si sabes cómo hacerlo.
- STL en Visual Studio ha comprobado los iteradores y ha mejorado el soporte del iterador que es mucho mejor que el de StlPort. Aquí es donde la mayor parte de la desaceleración proviene especialmente de la depuración. Los iteradores marcados están habilitados tanto en la depuración como en la versión y esto no es algo que todos conozcan (usted mismo tiene que deshabilitarlos).
- STL en Visual Studio 2008 SP1 viene con TR1 y no tiene esto en StlPort
- STL en Visual Studio 2010 usa referencias rvalue de C ++ 0x y aquí es donde obtienes un beneficio de rendimiento real.
Hemos hecho la tarea opuesta recientemente. Nuestra aplicación es un programa de servidor C ++ multiplataforma y está construida en Windows con VS 2008 (x86) y en HP-UX ia64 y Linux con gcc 4.3. En cada plataforma utilizamos el STLport 5.1.7 como biblioteca STL y Boost 1.38.
Para comparar el rendimiento hace algún tiempo, también creamos nuestra aplicación sin STLport y luego medimos el rendimiento.
Después de eso en Windows, el rendimiento se volvió un poco mejor. Por lo tanto, decidimos dejar de usar STLport con VS 2008 y usar la biblioteca STL VS 2008 predeterminada.
En HP-UX ia64 hubo un 20% de disminución en el rendimiento. Caliper (el perfilador HP-UX) mostró que las asignaciones de cadenas llevaban más tiempo. Y dentro de la asignación de cadenas en la biblioteca STG gcc por defecto había llamadas a pthread_mutex_unock. Hasta donde yo sé, pthread_mutex_lock / pthread_mutex_unlock se usan porque la biblioteca STL predeterminada de gcc usa COW-strings. En nuestra aplicación, hacemos muchas asignaciones de cadenas y, como resultado de las cadenas COW, obtenemos un peor rendimiento. Así que todavía usamos STLPort en HP-UX con gcc.
No comparé el rendimiento de STLPort con MSCVC, pero me sorprendería si hubiera una diferencia significativa . (Por supuesto, en el modo de lanzamiento, las compilaciones de depuración pueden ser bastante diferentes). Lamentablemente, el enlace que proporcionaste, y cualquier otra comparación que he visto, es demasiado liviano en detalles para ser útil.
Antes incluso de considerar cambiar los proveedores estándar de la biblioteca, le recomiendo que haga un perfil detallado de su código para determinar dónde están los cuellos de botella. Este es un consejo estándar; siempre perfil antes de intentar cualquier mejora en el rendimiento!
Incluso si la creación de perfiles revela problemas de rendimiento en contenedores de biblioteca estándar o algoritmos, le sugiero que primero analice cómo los está usando . Las mejoras algorítmicas y la selección adecuada de contenedores, especialmente teniendo en cuenta los costos de Big-O, tienen muchas más probabilidades de generar mayores rendimientos en el rendimiento.
No lo he intentado, pero hasta donde sé, no ha habido cambios importantes en la implementación de STL de Microsoft. (No hay grandes optimizaciones nuevas en el compilador VS2008 en 2005 tampoco). Entonces, si STLPort fue más rápido entonces, probablemente todavía sea el caso.
Pero eso es solo especulación. :) Asegúrese de informar los resultados si lo prueba.
Si usa el STLPort, ingresará a un mundo en el que todas las bibliotecas de terceros basadas en STL que use deberán compilarse también con STLPort para evitar problemas ...
STLPort tiene una estrategia de memoria diferente, pero si este es su cuello de botella, entonces su ruta de ganancia de rendimiento está cambiando el asignador (cambiando a Hoard por ejemplo), sin cambiar el STL.
Un beneficio de stlport es que es de código abierto.