¿Elija C ++ o Java para aplicaciones que requieren grandes cantidades de RAM? [cerrado]

11

Estoy pensando en aplicaciones científicas que en su mayoría están vinculadas al procesador y son muy pesadas en el uso del montón (al menos varios gigabytes). En cualquier otro momento del año, me encantaría ir con C ++, pero en este caso me pregunto si la fragmentación natural del administrador de memoria de C ++ puede ser un problema grave frente a la ventaja de los colectores de compactación de Java.

¿Alguien puede señalar ejemplos del mundo real relacionados con esto?

dsign
fuente
No creo que el lenguaje sea tan importante como la programación en este caso. Cualquier lenguaje maduro probablemente podría funcionar dependiendo de la escala de su cálculo. Hay Javas, C / C ++, incluso Pythons y Rubies que pueden deslizarse en este rol. Algunos serían más difíciles que otros, ya que parece que realmente necesita tener una seguridad firme de que no está perdiendo memoria.
Plataforma
2
Si puede obtener un GB por $ 7.99, ¿es un problema? Kingston 1GB DDR3
Bo Persson
2
@BoPersson, en mi experiencia, las personas que tienen ese tipo de problemas comienzan poblando completamente su placa base de gama alta y se quejan de que no pueden colocar allí tanto como les gustaría, y luego alimentan un conjunto de datos tan grande como manejable y luego se quejan de que No es suficiente.
Programador
@dsign, en estos días en los que puedes hacer que la placa base acepte varios cientos de conciertos de memoria por menos de 1000 €, algunos conciertos no son muy pesados ​​en el uso de la memoria.
Programador
1
De acuerdo con la parte de memoria barata. En cuanto al desarrollo, he estado en C ++ por un tiempo y las buenas prácticas de codificación hacen que las fugas sean un fenómeno poco frecuente; de hecho, realmente prefiero C ++ sobre Java en ese sentido.
dsign

Respuestas:

11

Si está hablando de una aplicación que seguramente enfatizará los límites de la máquina, de modo que espera que haga trucos de programación para evitar exceder esos límites, entonces C ++ es el camino a seguir. No solo C ++ le da espacio para la optimización donde Java no lo hace (como señaló Emilio), sino que también los recolectores de basura son artilugios muy hambrientos de memoria que necesitan mucha memoria adicional para funcionar de manera eficiente.

Las respuestas a esta pregunta: StackOverflow: ¿Cuánta memoria adicional requiere la recolección de basura ? pintar una imagen bastante sombría, pero incluso si los recolectores de basura necesitan que la memoria libre sea tan grande como la memoria asignada, (que es lo que había escuchado), esto todavía significa que con Java todavía necesitarás mucha memoria libre para que funcione de manera eficiente.

Por otro lado, hoy en día generalmente preferimos comprar hardware más costoso que tener que realizar trucos de programación para evitar exceder los límites del hardware. En su caso, sus problemas de RAM normalmente se resolverían utilizando una máquina de 64 bits y agregando tantos módulos de RAM como sea necesario. Usted ve, el costo del hardware no está ni cerca del costo del tiempo de desarrollo en el mundo desarrollado hoy en día.

Creo que debería considerar seriamente esta opción, y si es posible, opte por esta opción y con Java en lugar de C ++, porque es mucho más fácil desarrollar algo en Java que en C ++, y seguir manteniéndolo después.

Mike Nakis
fuente
Gracias por tu respuesta. Estoy de acuerdo con tu ilustración de hardware.
dsign
Si no le importa la pausa del programa mientras se ejecuta la recolección de basura, las necesidades de memoria son mucho menores.
1
No estoy de acuerdo con el último párrafo. Java no es necesariamente más fácil de desarrollar que C ++. No sería para mí, ya que he hecho mucho C ++ y relativamente poco Java en los últimos cinco o seis años. Es posible escribir código mantenible y no mantenible tanto en C ++ como en Java.
David Thornley
1
@DavidThornley He hecho C / C ++ por más de 10 años y Java por más de 6 años. Creo que Java es más fácil en todos los aspectos: creación de prototipos, desarrollo, extensión y mantenimiento. Pero en cualquier caso, eso es lo que las opiniones deben hacer: diferir . C -: =
Mike Nakis
¿Alguno de ustedes ha programado para un proyecto de grandes datos y hambre de procesador? ¿Algún comentario allí?
dsign
7

El problema no es usar C ++ ya que es Java y no usar Java ya que es C ++. Normalmente se implementa un contenedor C ++ para evitar el exceso de fragmentación, al igual que lo hace la tienda gratuita de Java.

Pero si se asigna la memoria directamente, también puede hacer cosas que Java no le permite hacer, lo que puede resultar en fragmentación.

La solución adecuada (en C ++) es usar contenedores y punteros inteligentes a través de clases de asignación que gestionan la asignación mediante "plexos" fijos (el punto clave, aquí, es escribir una buena clase de asignación). Y este es un estilo de programación que no tiene nada que ver con Java, por lo que cualquier comparación no tiene sentido.

[EDITAR] Esta puede ser una muestra desactualizada: asignación fija

Emilio Garavaglia
fuente
Gracias por tu respuesta Emilio. Soy consciente de la flexibilidad de C ++ y me siento inclinado a estar de acuerdo con usted. Por otra parte, me gustaría conocer algunos ejemplos de uso real donde estas técnicas se han utilizado para el éxito.
dsign
@dsign: Publicación editada, vea el enlace
Emilio Garavaglia
1
Usé estas técnicas previamente. Una aplicación de bajo rendimiento cambió su asignador para usar un conjunto de montones de bloques fijos. Entonces, cuando quería un bloque de 4 bytes, provenía del montón que solo almacenaba bloques de 4 bytes. Si deseaba 5 bytes, provenía del montón de bloques de 8 bytes, etc. El aumento del rendimiento (para nuestra aplicación de gran asignación) fue tremendo. Es posible que no obtenga un resultado tan bueno, pero puede ser muy efectivo. También hubo cero fragmentación ya que todos los alocs vinieron en bloques fijos.
gbjbaanb
2

La ventaja de la recolección de basura es que simula una máquina con una cantidad infinita de memoria. El mecanismo o implementación de esa abstracción pretende ser completamente transparente para usted como programador. Todos sabemos que el mecanismo está recuperando memoria que el programa ya no usa, pero que en realidad no está garantizada. Si ejecuta el programa en una máquina con más RAM de la que el programa realmente utiliza, entonces la recolección de basura puede que nunca ocurra. Nuevamente, irrelevante, porque puedes escribir el programa sin importar cómo usa la memoria. El administrador de memoria solo asignará más RAM cada vez que el programa lo solicite, y se le permite suponer que tales asignaciones siempre tendrán éxito. Java es un lenguaje recolectado de basura, y C ++ no lo es. 1

La desventaja de la recolección de basura es que, como todas las abstracciones , tiende a tener fugas. No siempre funciona perfectamente todo el tiempo, especialmente en casos extremos, y es probable que te encuentres con errores. Las personas que escribieron el algoritmo de recolección de basura (el que se supone que es transparente para usted como programador) optimizado para los casos más comunes, y el problema con los casos comunes es que nunca son tan comunes. En general , no puede hacer nada mejor que el recolector de basura en la gestión de la memoria. Pero en circunstancias específicas (y dada una cantidad suficiente de tiempo, energía y comprensión), podría ser posible. C ++ le brinda esta flexibilidad; Java no lo hace.

Dicho todo esto, creo que el consejo estándar para elegir un idioma se aplica aquí, quizás aún más en este caso dadas las limitaciones. Elija el idioma que sea más familiar para los desarrolladores principales del proyecto. Además de las razones obvias (como que podrá desarrollar la aplicación más rápido y de manera más eficiente), esto es particularmenteimportante en el caso que describa porque programar C ++ como si estuviera programando Java resultará en prácticas de administración de memoria terriblemente ineficaces y, por lo tanto, fugas y fallas. De manera análoga, programar en Java como si estuvieras programando en C ++ no te va a hacer mucho bien, y puede terminar produciendo un programa menos que optimizado, dado que los algoritmos de recolección de basura están ajustados y ajustados para los casos más comunes .

Los programadores que están acostumbrados a trabajar en lenguajes recolectados de basura aprenden a confiar en el recolector de basura, en lugar de luchar contra él. Si está trabajando en un lenguaje de recolección de basura, estos son los programadores que desea en su proyecto. Programadores que no sonacostumbrados a trabajar en un lenguaje recolectado de basura, son intrínsecamente escépticos de tal abstracción de "memoria infinita", y con frecuencia con muchas buenas razones. A pesar de lo buenos que pueden ser estos programadores, estos no son los que desea trabajar en un lenguaje recolectado de basura porque estarán luchando contra el GC en cada paso del camino, constantemente cuestionándolo y a menudo produciendo una memoria más lenta y menos eficiente código que el otro tipo de programador. En el mejor de los casos, pasarán mucho tiempo reinventando la rueda, lo que le costará mucho dinero e incluso más en costos de mantenimiento a largo plazo.

Y luego también debe preguntarse si realmente importa. Hay más que un indicio de verdad en el comentario sarcástico de Bo: la memoria es tan barata ahora que apenas vale la pena exprimirla demasiado. Incluso si necesita cantidades masivas , esas cantidades no son tan masivas ahora como lo fueron hace 10 años. Los programadores y el desarrollo de aplicaciones son mucho más caros que solo comprar grandes cantidades de RAM y potencia de procesamiento. Eso no significa que deba evitar la economía donde sea posible, pero sí significa que tampoco debe perder demasiado tiempo haciéndolo.


1 Por supuesto, esta suposición destaca un defecto más profundo en la pregunta. Como resultado, "Java o C ++" es un poco una pista falsa. La implementación estándar de Java proporciona recolección de basura y C ++ no cumple con el estándar de lenguaje, pero no hay absolutamente ninguna razón por la que no pueda usar un recolector de basura de terceros para C ++. Muchas empresas se han ganado la vida vendiendo estas cosas, y algunas probablemente se han ganado la vida regalándolas gratuitamente.

Cody Gray
fuente