119 votos

C Comportamiento vs Java / C #

Mi entendimiento es que C/C++ genera código nativo para que se ejecute en una máquina en particular de la arquitectura. Por el contrario, en lenguajes como Java y C# en la parte superior de una máquina virtual que resúmenes de distancia la arquitectura nativa. Lógicamente es imposible para Java o C# para que coincida con la velocidad de C++ debido a que este paso intermedio, sin embargo me han dicho que los compiladores más recientes ("hot spot") puede alcanzar esta velocidad o incluso lo superan.

Tal vez esto es más de un compilador pregunta de un idioma pregunta, pero, ¿puede alguien explicar en términos sencillos cómo es posible que uno de estos máquina virtual de idiomas que funcionan mejor que un nativo de idioma?

179voto

Orion Adrian Puntos 8855

En general, C# y Java puede ser tan rápido o más rápido debido a que el compilador JIT -- un compilador que compila el IL la primera vez que se ejecuta -- puede hacer optimizaciones que C++ compilado el programa no puede porque se puede consultar la máquina. Se puede determinar si el equipo es Intel o AMD, Pentium 4, Core Solo, o Core Duo; o si apoya SSE4, etc.

Un programa de C++ ha de ser compilado de antemano generalmente con una mezcla de optimizaciones para que corra decentemente bien en todos los equipos, pero no está optimizado tanto como podría ser el caso de una configuración individual (es decir. procesador, conjunto de instrucciones, otro hardware).

Además, ciertas características del lenguaje permiten que el compilador de C# y Java para hacer suposiciones acerca de su código que permite optimizar ciertas partes que no sólo son seguros para el compilador C/C++ para hacer. Cuando usted tiene acceso a los punteros que hay un montón de optimizaciones que no sólo son seguros.

También Java y C# se pueden hacer asignaciones de montón más eficiente que C++ debido a que la capa de abstracción entre el recolector y el código le permite hacer todo este montón de compresión a la vez (bastante caro).

Ahora no puedo hablar por Java en este punto siguiente, pero sé que en C# por ejemplo, se eliminan los métodos y las llamadas de método cuando se sabe que el cuerpo del método está vacía. Y se va a utilizar este tipo de lógica en todo el código.

Así como usted puede ver, hay un montón de razones por las que ciertas C# o Java implementaciones será más rápido.

Ahora esta todo dicho, optimizaciones específicas puede ser hecho en C++ que le golpe de distancia de cualquier cosa que usted podía hacer con C#, especialmente en los gráficos reino y cuando esté cerca del hardware. Punteros a hacer maravillas aquí.

Así que dependiendo de lo que estás escribiendo me gustaría ir con uno o con el otro. Pero si usted está escribiendo algo que no depende del hardware (driver, juego de video, etc), no te preocupes sobre el rendimiento de C# (de nuevo no se puede hablar de Java). Lo vas a hacer muy bien.

Uno al lado de Java, @Swati señala un buen artículo:

http://www-128.ibm.com/developerworks/java/library/j-jtp09275.html?ca=dgr-jw22JavaUrbanLegends

48voto

Jon Norton Puntos 2048

Cuando hablo administrado vs. no administrado de rendimiento, me gusta el punto a la serie Rico (y Raymond) hizo la comparación de C++ y C# versiones de un Chino/inglés diccionario. Esta búsqueda de google va a dejar de leer por ti mismo, pero me gusta más Rico del resumen.

Así que estoy avergonzado por mi derrota aplastante? Difícilmente. El código administrado tiene una muy buen resultado para casi ningún esfuerzo. A derrotar a los administrados Raymond tuvo a:

  • Escribir su propia e/S de archivos cosas
  • Escribir su propia clase string
  • Escribir su propia asignador
  • Escribir su propia internacional de asignación de

Por supuesto, él utiliza inferior a nivel de las bibliotecas a hacer esto, sino que todavía un montón de trabajo. ¿Puede usted llamar a lo que queda de un programa STL? Yo no creo que sí, creo que él mantuvo la std::vector de la clase que en última instancia se nunca un problema y se mantuvo la de encontrar función. Casi todo lo demás se ha ido.

Así que, sí, puede vencer definitivamente la CLR. Raymond puede hacer que su programa vaya incluso más rápido que yo pienso.

Curiosamente, el tiempo para analizar la archivo según lo informado por ambos programas temporizadores internos es de aproximadamente el mismo -- 30ms para cada uno. La diferencia está en la sobrecarga.

Para mí la conclusión es que se tomaron 6 revisiones para el no administrado versión para vencer a los manejado la versión de que era un simple port del original de código no administrado. Si necesita hasta el último bit de rendimiento (y tener el tiempo y la experiencia para conseguirlo), tendrás que ir no administrado, pero para mí, voy a tomar el orden de magnitud de la ventaja que tengo en las primeras versiones sobre el 33% de ganancia si trato de 6 veces.

27voto

OldMan Puntos 523

La compilación de la CPU optimizaciones son generalmente sobrevalorado. Acaba de tomar un programa en C++ y compilar con optimización para el pentium PRO y pentium 4. A continuación, vuelva a compilar con optimizar para pentium 4. He pasado largas tardes de hacerlo con varios programas. Resultados generales?? Por lo general menos de un 2-3% de aumento de rendimiento. Por lo que el teórico JIT ventajas son casi nulas. La mayoría de las diferencias de rendimiento sólo puede ser observado cuando se utiliza escalar de procesamiento de datos de características, algo que finalmente manual de la necesidad tunning fino para lograr el máximo rendimiento de todos modos. Optimizaciones de que tipo son lentos y costosos para realizar haciéndolos a veces inadecuados para el JIT de todos modos.

En el mundo real y real de la aplicación de C++ es generalmente más rápido que java, principalmente debido a la más ligera huella de memoria que se traducen en un mejor rendimiento de la caché.

Pero para usar los de C++ de la capacidad que usted, el desarrollador debe trabajar duro. Usted puede lograr resultados superiores, pero usted debe usar su cerebro para eso. C++ es un lenguaje que se decidió a presentar con más herramientas, cobrando el precio que usted debe aprender a ser capaz de utilizar bien el idioma.

21voto

FlySwat Puntos 61945

JIT (Justo a Tiempo de Compilación) puede ser muy rápido, porque se optimiza para la plataforma de destino.

Esto significa que puede tomar ventaja de cualquier compilador de engañar a su CPU puede admitir, independientemente de lo de la CPU, el desarrollador escribió el código.

El concepto básico de la .NET JIT obras como esta (fuertemente simplificada):

Se llama a un método para la primera vez:

  • El código del programa llama a un método Foo()
  • El CLR se ve en el tipo que implementa Foo() y obtiene los metadatos asociados con ella
  • A partir de los metadatos, el CLR sabe qué dirección de memoria de la IL (Intermediate código de bytes) se almacena en.
  • El CLR asigna un bloque de memoria, y llama al JIT.
  • El JIT se compila el IL a código nativo, lo coloca en la memoria asignada y, a continuación, cambia el puntero de función de Foo()'s el tipo de metadatos para que señale este código nativo.
  • El código nativo que se corrió.

Se llama a un método para el segundo tiempo:

  • El código del programa llama a un método Foo()
  • El CLR se ve en el tipo que implementa Foo() y encuentra la función de puntero en los metadatos.
  • El código nativo en esta ubicación de memoria que se corrió.

Como se puede ver, la 2ª vez, su prácticamente el mismo proceso como C++, excepto con la ventaja del tiempo real de las optimizaciones.

Dicho esto, todavía hay otros sobrecarga de los problemas que reducir la velocidad de un lenguaje administrado, pero el JIT es de gran ayuda.

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