2009-01-23 13 views
20

Estoy involucrado en una empresa que transferirá algunas comunicaciones, análisis, funcionalidad de manejo de datos de Win32 a Linux y ambos serán compatibles. El dominio del problema es muy sensible al rendimiento y rendimiento.boost vs ACE C++ Comparación de rendimiento de plataforma cruzada?

Tengo muy poca experiencia con las características de rendimiento de boost y ACE. Específicamente, queremos entender qué biblioteca ofrece el mejor rendimiento para el enhebrado.

¿Alguien puede proporcionar algunos datos (documentados o de boca en boca o tal vez algunos enlaces) sobre el rendimiento relativo entre los dos?

EDIT

Gracias a todos. Confirmamos nuestras ideas iniciales: lo más probable es que elijamos impulsar las cosas multiplataforma a nivel del sistema.

Respuesta

27

Ninguna biblioteca realmente debería tener una sobrecarga en comparación con el uso de las funciones de enrutamiento del sistema operativo nativo. Deberías mirar qué API es más limpia. En mi opinión, la API de subprocesos API es significativamente más fácil de usar.

ACE tiende a ser más "OO clásico", mientras que el impulso tiende a extraer del diseño de la biblioteca estándar de C++. Por ejemplo, iniciar un hilo en ACE requiere crear una nueva clase derivada de ACE_Task y anular la función svc() virtual a la que se llama cuando se ejecuta el hilo. En el impulso, creas un hilo y ejecutas la función que quieras, que es significativamente menos invasiva.

+0

Buena comparación. –

+0

Acerca de comenzar hilos, eso simplemente no es verdad. Eche un vistazo a: int ACE_Thread_Manager :: spawn (ACE_THR_FUNC func, void * arg = 0, ...); – alexkr

+0

Cierto, no he usado esa funcionalidad en particular, pero aún así, todavía requiere una firma de función como 'void * foo (void *);' (es decir, pthreads-esque), así que tendrías que hacer tu propia Argumento de argumentos y ajuste para devolver un puntero de vacío. –

2

Enhebrar es realmente solo una pequeña parte de lo que proporcionan el impulso y ACE, y los dos no son realmente comparables en general. Estoy de acuerdo en que impulsar es más fácil de usar, ya que ACE es un marco bastante pesado.

8

No se preocupe por la sobrecarga de una capa de abstracción de SO en objetos de subprocesamiento y sincronización. Threading literalmente no importa en absoluto (ya que solo se aplica a la creación de subprocesos, que ya es enormemente lenta en comparación con la sobrecarga de un indirecto puntero pimpl -ized). Si encuentra que las operaciones mutex le están ralentizando, es mejor que observe las operaciones atómicas o reorganice sus patrones de acceso a los datos para evitar la contención.

En cuanto a boost vs. ACE, se trata de una programación de "nuevo estilo" frente a "viejo estilo". Boost tiene muchas trampas basadas en plantillas basadas en plantillas (que son hermosas para trabajar, si puedes apreciarlas). Si, por otro lado, estás acostumbrado al estilo "C con clases" de C++, ACE se sentirá mucho más natural. Creo que es principalmente una cuestión de gusto personal para su equipo.

2

No llamaría a ACE "C con clases". ACE no es intuitivo, pero si te tomas tu tiempo y usas el marco como es debido, no te arrepentirás.

Por lo que puedo decir, después de leer los documentos de Boost, me gustaría utilizar el marco de ACE y las clases de contenedor de Boost.

20

Hazte un favor y aléjate de ACE. Es una biblioteca horrible, horrible que nunca debería haber sido escrita, si me preguntas. Trabajé (o más bien TENÍA que trabajar con él) durante 3 años y te digo que es una pieza de basura mal diseñada, mal documentada y mal implementada que usa C++ arcaico y que se basa en decisiones de diseño totalmente con muerte cerebral ... llamando a ACE "C con clases" en realidad lo está haciendo un favor. Si observa las implementaciones internas de algunos de sus constructos, a menudo le costará suprimir el reflejo nauseoso. Además, no puedo enfatizar lo suficiente el aspecto de "documentación deficiente". Usualmente, la noción de ACE de documentar una función consiste simplemente en imprimir la firma de la función. En cuanto al significado de sus argumentos, su valor de retorno y su comportamiento general, bueno, por lo general, se queda solo para resolverlo por su cuenta.Estoy harto y cansado de tener que adivinar qué excepciones puede arrojar una función, cuyo valor de retorno denota éxito, qué argumentos tengo que aprobar para que la función haga lo que necesito o si una función/clase es segura para subprocesos o no.

Boost por otro lado, es simple de usar, C++ moderno, extremadamente bien documentado, ¡y FUNCIONA! Boost es el camino a seguir, ¡abajo con ACE!

+0

Gracias - Íbamos con el impulso incluso antes de sus comentarios apasionados – Tim

+9

Aunque no sé sobre ACE, debo decir que la documentación de Boost es muy confusa dependiendo del módulo de Boost que esté utilizando. Algunos son geniales, otros son horribles. –

6

Incluso si ACE es una especie de C++ de la vieja escuela, todavía tiene muchas características orientadas a subprocesos que el impulso aún no proporciona.

Por el momento no veo ninguna razón para no usar ambos (pero para diferentes propósitos). Una vez que el impulso proporcione un medio simple para implementar colas de mensajes entre las tareas, puedo considerar abandonar ACE.

+0

Sí, para encolamiento de mensajes es un gran marco. Sin embargo, no necesitamos esa parte de comunicaciones. Solo el enhebrado. – Tim

+0

Bueno, siempre puedes crear un boost :: interprocess :: message_queue con un nombre único, y solo usarlo desde tu proceso. Puede usar el constructor create_only_t para asegurarse de que este nombre no esté siendo utilizado por otro proceso, y luego anexar 1, 2, 3, etc. hasta que tenga éxito. Desafortunadamente no son compatibles con message_queue anónimos (lo mismo que posix ...). Dado que una cola local de proceso es fácil de implementar con semáforo + mutex, no hay ninguna razón por la que no deba hacerlo usted mismo. –

+0

la cola de mensajes ya se admite en boost: http://www.boost.org/doc/libs/1_35_0/doc/html/boost/interprocess/message_queue.html – rjoshi

0

He estado usando ACE durante muchos años (8) pero acabo de comenzar a investigar el uso de boost de nuevo para mi próximo proyecto. Estoy considerando aumentar porque tiene una bolsa de herramientas más grande (regex, etc.) y partes de ella están siendo absorbidas en el estándar de C++ por lo que el mantenimiento a largo plazo debería ser más fácil. Dicho esto, el impulso va a requerir algún ajuste. Aunque Greg menciona que el soporte de subprocesos es menos invasivo ya que puede ejecutar cualquier función (C o estática), si está acostumbrado a usar clases de subprocesos más parecidas a las clases de subprocesos Java y C# que es lo que proporciona ACE_Task, tiene usar un poco de delicadeza para obtener lo mismo con el impulso.

7

He usado ACE para numerosos servidores de producción de servicio pesado. Nunca me falló. Es sólido como una roca y hace el trabajo por muchos años. Traté de aprender el marco de red ASIO de BOOST. No pude entenderlo. Aunque BOOST es más "moderno" C++, también es más difícil de usar para tareas no triviales, y sin una experiencia "moderna" de C++ y profundo conocimiento de STL es difícil de usar correctamente

+0

Estoy totalmente de acuerdo. ACE solo funciona. – Tim

1

Utilice ACE y aumente cooperativamente. ACE tiene una mejor API de comunicación, basada en patrones de diseño de OO, mientras que boost tiene un diseño similar al "C++ moderno" y funciona bien con contenedores, por ejemplo.

1

Empezamos a utilizar ACE creyendo que ocultaría las diferencias de plataforma presentes entre Windows y Unix en sockets TCP y la llamada de selección. Resulta que no. El enfoque de Ace sobre select, el patrón del reactor, no puede mezclar sockets y stdin en windows, y las diferencias semánticas entre las plataformas con respecto a las notificaciones de escritura de socket todavía están presentes en el nivel de ACE.

Cuando nos dimos cuenta de esto, ya estábamos usando las funciones de subprocesos y procesos de ACE (este último no oculta las diferencias de la plataforma en la medida que nos hubiera gustado) para que nuestro código ahora esté vinculado a un ¡una gran biblioteca que realmente impide la transferencia de nuestro código a 64 Bit MinGW!

No puedo esperar al día en que el último uso de ACE en nuestro código sea finalmente reemplazado por algo diferente.

+0

Las versiones recientes de ACE admiten MinGW64 para Windows de 32 bits y 64 bits sin problemas. En relación con stdin, existe un método especial en el reactor para registrar un controlador de eventos que funcione en Windows y en todas las demás plataformas. –

3

Cuando se trata de facilidad de uso, el impulso es mucho mejor que ACE. boost-asio tiene una API más transparente, sus abstracciones son más simples y pueden proporcionar bloques de construcción a su aplicación. El polimorfismo en tiempo de compilación se usa juiciosamente para potenciar/prevenir el código ilegal. Los usos de las plantillas de ACE, por otro lado, se limitan a la generalización y casi nunca están lo suficientemente centrados en el usuario como para no permitir operaciones ilegales. Es más probable que descubras problemas en el tiempo de ejecución con ACE.

Un ejemplo simple que puedo pensar es ACE_Reactor, una interfaz bastante escalable y desacoplada, pero debe recordar llamar a su función "propia" si está ejecutando su bucle de evento en un hilo diferente de donde fue creado . Pasé horas para resolver esto por primera vez y podría haber pasado días fácilmente. Irónicamente, su modelo de objetos muestra más detalles de los que esconde: buenos para el aprendizaje pero malos para la abstracción.

https://groups.google.com/forum/?fromgroups=#!topic/comp.soft-sys.ace/QvXE7391XKA

Cuestiones relacionadas