25 votos

Java colecciones más rápido que c++ contenedores?

Estaba leyendo los comentarios de esta respuesta y vi a esta cita.

Creación de instancias de objeto y características orientadas a objetos son blazing rápido (más rápido que C++ en muchos de los casos) debido a que están diseñados desde el principio. y las Colecciones son rápidos. Estándar de Java beats estándar de C/C++ en esta área, incluso para la mayoría de las optimizado C código.

Un usuario (con muy alto representante debo añadir) valientemente defendió esta afirmación, indicando que

  1. la asignación del montón en java es mejor que C++

  2. y añadió esta declaración de la defensa de las colecciones en java

    Y de colecciones Java son rápidos en comparación con C++ colecciones debido en gran parte a los diferentes subsistema de memoria.

Así que mi pregunta es ¿puede alguno de esto ser cierto, y si es así ¿por qué es java montón de asignación, de forma mucho más rápida.

41voto

James Kanze Puntos 96599

Este tipo de declaración es ridículo; la gente haciendo que se increíblemente ignorantes, o increíblemente deshonesto. En en particular:

  • La velocidad de la asignación dinámica de memoria en los dos casos se dependen del patrón de la dinámica de uso de la memoria, así como la aplicación. Es trivial para alguien familiarizado con el los algoritmos utilizados en ambos casos para escribir una referencia demostrando que cada vez que él quería ser más rápido. (Así, por ejemplo, los programas de el uso de grandes y complejos, gráficos de construir, luego de demoler y reconstruido, normalmente se ejecutará más rápido bajo la recolección de basura. Como los programas que no utilice nunca suficiente memoria dinámica para desencadenar el colector. Los programas que utilizan pocos, grandes, de larga duración las asignaciones de frecuencia a correr más rápido con el manual de memoria de gestión).

  • Al comparar las colecciones, usted tiene que considerar lo que es en las colecciones. Si usted está comparando los grandes vectores de double, por ejemplo, la diferencia entre Java y C++ probablemente sea leve, y puede ir de cualquier manera. Si usted está comparando los grandes vectores de Point, donde Point es un valor de la clase que contiene dos dobles, C++ probablemente golpe de Java fuera del agua, porque utiliza puro valor de la semántica (con no más de dinámica la asignación), donde como Java necesidades para asignar dinámicamente cada Point (y no la asignación dinámica es siempre más rápido que incluso el más rápido de la asignación dinámica). Si el Point de la clase en Java está correctamente diseñada para actuar como un valor (y por lo tanto inmutable, como java.lang.String), a continuación, haciendo una traducción sobre la Point en un vector se requerirá de una nueva asignación para cada Point; en C++, se podría asignar.

  • Mucho depende del optimizador. En Java, el optimizador de obras con el conocimiento perfecto de la utilización real de los casos, en este especial de ejecución del programa, y el conocimiento perfecto de la procesador real que se está ejecutando, en esta carrera. En C++, el el optimizador debe trabajar con los datos de un perfil de ejecución, que se nunca se corresponden exactamente con cualquiera de ejecución del programa, y la el optimizador debe (por lo general) generar código que se ejecutará (y ejecutar rápidamente) en una amplia variedad de versiones del procesador. En el otro lado, el C++ optimizador puede tomar mucho más tiempo el análisis de las diferentes rutas de acceso y eficaz de optimización puede requieren una gran cantidad de CPU); el Java optimizador tiene que ser bastante rápido.

  • Por último, aunque no es relevante para todas las aplicaciones, C++ puede ser de un solo subproceso. En el que caso de que, sin bloqueo, es necesario en el el colocador, que nunca es el caso en Java.

Con respecto a los dos puntos numerados: C++ se puede utilizar más o menos los mismos algoritmos como Java en su asignador de montón. He utiliza los programas de C++ donde la ::operator delete() función vacío, y la memoria era el recolector de basura. (Si su la aplicación asigna un montón de corta duración, objetos pequeños, tales un asignador probablemente acelerar las cosas.) Y en cuanto a la segundo: los realmente grandes ventajas de C++ es que su memoria modelo no requiere todo ser asignados dinámicamente. Incluso si la asignación en Java toma sólo una décima parte del tiempo que tomaría en C++ (que podría ser el caso, si se cuentan sólo la asignación, y no el tiempo necesario para el coleccionista barre), con grandes vectores de Point, como en el anterior, está la comparación de dos o tres asignaciones en C++ con millones de las asignaciones en Java.

Y por último: "¿por qué es Java montón de asignación mucho más rápido?" Es no es, necesariamente, si usted amortizar el tiempo para el etapas de recolección. El tiempo para la asignación de sí mismo puede ser muy barato, ya que Java (o al menos la mayoría de las implementaciones de Java) el uso de una reubicación del colector, lo que resulta en todos los de la libre la memoria en un solo bloque contiguo. Esto es al menos parcialmente compensado por el tiempo necesario en el colector: para obtener que la contigüidad, tienes que mover los datos, lo que significa una gran cantidad de la copia. En la mayoría de las implementaciones, también significa un adicional de direccionamiento indirecto en los punteros, y un montón de una lógica especial para evitar problemas cuando un hilo tiene la dirección en un registro, o tal.

30voto

Jason C Puntos 14927

Tus preguntas no tienen respuestas concretas. Por ejemplo, en C++ no define la gestión de la memoria. Deja de asignación de datos para la implementación de la biblioteca. Por lo tanto, dentro de los límites de C++, una determinada plataforma puede tener una muy lento montón esquema de asignación, y Java sin duda sería más rápido si se pasa por alto que. En otra plataforma, las asignaciones de memoria puede ser asombrosamente rápido, superando a Java. Como James Kanze señaló, Java también lugares muy poco limitaciones en la gestión de la memoria (por ejemplo, incluso la GC algoritmo es totalmente de la JVM implementador). Debido a que Java y C++ no coloque las limitaciones en la gestión de la memoria, no hay respuesta concreta a esa pregunta. C++ es cuestión abierta sobre el hardware subyacente y funciones del kernel, y de Java es, a propósito abierta acerca de la gestión de memoria de la JVM. Así que la pregunta es muy confusa.

Usted puede encontrar que algunas operaciones son más rápidas en Java, y algunos no. Nunca se sabe hasta que lo intenta, sin embargo:

En la práctica, las verdaderas diferencias se encuentran en su nivel más alto algoritmos e implementaciones. Para todos, pero el más absoluto de rendimiento de aplicaciones críticas, las diferencias en el rendimiento de idénticas estructuras de datos en diferentes idiomas es completamente insignificante en comparación con las características de rendimiento del algoritmo en sí. Concentrarse en la optimización de su nivel más alto de las implementaciones. Sólo después de que usted lo ha hecho, y después de haber determinado que los requisitos de rendimiento no están siendo satisfechas, y después de haber comparado y encontrado (poco probable) de que su cuello de botella está en implementaciones de contenedor, se debe empezar a pensar en cosas como esta.

En general, tan pronto como usted se encuentra pensando o leyendo acerca de C++ vs problemas de Java, parar y volver a centrarse en algo productivo.

15voto

kriomant Puntos 1099

Java heap es más rápido porque (simplificado) todo lo que necesita hacer para asignar es aumentar el montón de la parte superior de puntero (como en la pila). Es posible porque el montón periódicamente compactada. Por lo que su precio de velocidad es:

  1. Periódico GC pausas para el montón de compactación
  2. El aumento de uso de memoria

No hay queso libre... Así que mientras que las operaciones de recogida puede ser rápido, es amortizado por el general de desaceleración durante la GC trabajo.

9voto

Peter Lawrey Puntos 229686

Mientras que yo soy un fan de Java, vale la pena señalar que C++ admite la asignación de los objetos en la pila que es más rápido que la asignación del montón.

Si usas C++ de manera eficiente con todas las diversas maneras de hacer la misma cosa, va a ser más rápido que Java (incluso si se necesita más tiempo para encontrar que una combinación óptima)

Si se programa en C++ como en Java, por ejemplo, todo lo que en el montón, todos los métodos virtuales, tienen un montón de tiempo de ejecución de los cheques, que no hacen nada y se puede optimizar la distancia de forma dinámica, será más lenta. Java se ha optimizado estas cosas más como estos) son la única cosa que hace el Java, b) se puede optimizar dinámicamente de manera más eficiente, c) Java tiene menos características y efectos secundarios, así es más fácil para el optimizador de conversiones para obtener velocidades decentes.

1voto

meriton Puntos 30447

y las Colecciones son rápidos. Estándar de Java beats estándar de C/C++ en esta área, incluso para la mayoría de las optimizado C código.

Esto puede ser cierto para colecciones particulares, pero ciertamente no es cierto para todas las colecciones en todos los patrones de uso.

Por ejemplo, java.util.HashMap superan un std:map, debido a que éste debe ser ordenados. Es decir, el más rápido en el Mapa de la Biblioteca Estándar de Java es más rápido que el más rápido en el Mapa de C++ (por lo menos antes de C++11, que añadió el std:unordered_map)

Por otro lado, un std:Vector<int> es mucho más eficiente que un java.util.ArrayList<Integer> (debido al tipo de borrado, no se puede utilizar un java.util.ArrayList<int>, y por lo tanto terminan con cerca de 4 veces el consumo de memoria, y posiblemente más pobres de la caché de la localidad, y, en consecuencia, más lento de la iteración).

En definitiva, como la mayoría de las generalizaciones, esto no siempre se aplica. Sin embargo, ni el frente de afirmación (que Java es siempre más lento que C++). Realmente depende de los detalles, tales como la forma en que el uso de la colección, o incluso que las versiones de los idiomas que se compara).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X