Pablo Barrera

31 January, 2005

Golpeado por C++ y rebotado a C#

Filed under: Uncategorized — Pablo @ 22:16

Hace ya más o menos un año que estoy liado con un programa en C++ para el seguimiento de objetos con varias cámaras, cuestión de la que ya he hablado. Hace tiempo que no cuento nada sobre él, sobre todo porque he estado bastante ocupado haciendo que funcionara. Más de una vez me he preguntado porqué elegí usar C++ en vez de algo más
razonable, como C#. Razonable pensando en todos los problemas que siempre encuentro al usar C++:

  • Los punteros son muy útiles para manejar memoria cruda. El resto del tiempo son un dolor de impresión. Las referencias son mucho más fáciles de tratar.
  • El manejo de memoria con delete explícitos es como para liberar recursos en un momento dado. Con recolectores de basura es más difícil determinar cuando se borra un objeto. Aún así es un precio pequeño a pagar por tener las ventajas de un recolector de basura. Los delete se olvidan, a veces no sabes dónde hacerlos, los objetos se quedan o se borran antes de lo necesario. Segundo dolor de cabeza.
  • En general cuando un objeto se usa en dos sitios a la vez es difícil de saber cuándo hay que borrarlo. Estos problemas se pueden solucionar recubriendo los objetos con unos punteros inteligentes y unos contadores de referencia. Es bastante transparente, pero no deja de ser una solución artística.
  • La velocidad de C++ es alta. Muy alta. Eso sí, si eres capaz de compilarlo con -O3, claro. Una parte importante de los bugs (o por lo menos de los míos) aparecen mucho más claros con -O3. Para seguir usando el programa tiene a usar -O0, haciendo que las ventajas de velocidad ya no sean tan evidentes.
  • C++ es un buen lenguaje, pero no tiene las cosillas molonas de las nuevas generaciones de lenguajes. Por ejemplo la identificación de tipos en C++ solo aparece según el compilador usado. Esto hace que no sea utilizable si quieres tener la posibilidad de portar el código o por lo menos de usarlo en otras máquinas con compiladores diferentes.

Al final, tras dos días de depuración intensa, implementar punteros inteligentes e identificación de tipos el programa empezó a funcionar correctamente. La velocidad del resultado es buena, pero no consigo usar la optimización. Hay todavía unos cuantos bugs dispuestos a morderme detrás de la esquina. Esto me hace plantearme como de bueno sería este programa en C# y Mono. Con esta opción tendríamos desde el principio el recolector de basura y la identificación de tipos. Pero ¿sería suficientemete rápido?

Este pregunta no tiene una respuesta tan inmediata. Mucho se ha escrito acerca de la eficiencia de C# y Mono pero lo mejor es hacer una prueba para el entorno en que te mueves. En mi caso porté una un filtro de color a C# usando código unsafe y algún punterillo que otro. Para imágenes de 320×240 obtuve los siguientes resultados:

View Comments
blog comments powered by Disqus

Powered by WordPress