2010-12-10 13 views
9

El lote de perfiles muestra que las transmisiones en C++ no son la mejor manera de realizar la manipulación de cadenas de archivos o texto cuando se requiere rendimiento (velocidad). Aún así, las transmisiones estándar son una buena manera de mantener las cosas seguras.¿Las referencias C++ 0x RValue u otras características tendrán un impacto en el rendimiento de las secuencias?

Según lo que he leído, la mayor parte del problema se debe a que las implementaciones de flujos tienen que 1) crear/copiar muchos objetos pequeños 2) ¿Son completamente genéricos (no gestionan char y wchar de la misma manera?) Etc. .De todos modos, estaba pensando que tal vez C++ 0x permitiría a los implementadores limitar al menos la creación/copia de objetos y tal vez hay otras características que permitirían otras mejoras de rendimiento, quizás permitiendo alcanzar el rendimiento de printf() ?

¿Hay un impacto inmediato? ¿O tendremos que esperar nuevas implementaciones? ¿O todavía necesitamos una nueva biblioteca de transmisión (similar a STL)?

+0

Solo una nota al margen sobre el tema. En mi opinión, las bibliotecas IO son súper difíciles de diseñar. Me gustaría que cualquiera apunte a una biblioteca IO en cualquier idioma que sea 1) seguro, 2) eficiente, 3) portátil y 4) utilizable por un programador promedio (¡como yo, por ejemplo!). No estoy diciendo que sea imposible diseñar uno con las condiciones anteriores, solo digo que es más difícil de lo que la mayoría de los programadores piensan. Por cierto, +1 para la pregunta. – AraK

+0

Estoy de acuerdo. Supongo que esa es la razón principal por la que existe Boost.IOStream para ayudar a implementar las transmisiones. He escuchado a algunas personas decir que los principales problemas con la transmisión estándar son que no pensaban con template/genericity porque no había una función de plantilla en el momento en que se implementó. A menudo sugieren que el diseño de una nueva biblioteca de flujo basada en genericity como STL resolvería muchos problemas de rendimiento. – Klaim

+0

IOstream se volvieron a implementar para el estándar. Un problema que tuve en 2002 al convertir un sistema pre-estándar de C++ en uno conforme a los estándares fue el cambio en lo que algunos de ellos eran, cuando se convirtieron en clases y funciones con plantillas. –

Respuesta

3

Puede que le interesen algunas de las comparaciones de rendimiento en my question here. Incluso las funciones de nivel más bajo en la API de secuencias de bibliotecas estándar de C++ son increíblemente lentas bajo implementaciones comunes, y mirando a través del código fuente de, p. La clase stringbuf de Visual C++, no veo la copia de pequeños objetos temporales. Entonces, las referencias de valores reales no son de gran ayuda.

AFAICT, la razón principal de la lentitud de C++ iostreams es que los desarrolladores de bibliotecas tienen una mentalidad de que las E/S son el cuello de botella, por lo que no tiene sentido preocuparse por el rendimiento de la biblioteca de E/S. Pero I/O definitivamente no es el cuello de botella.

+0

Gracias por dirigir su pregunta, ¡muy completo! – Klaim

+0

Sí. I/O es el cuello de botella ... pero el núcleo del sistema operativo lo maneja con almacenamiento en búfer. Perder el tiempo en las bibliotecas de E/S es solo una pérdida de tiempo. –

+0

@ Zan: También fue una sorpresa para mí la primera vez que comparé los iostreams de C++, pero son tan lentos que incluso en un caché de disco frío, I/O no es el cuello de botella. –

Cuestiones relacionadas