2008-09-15 20 views
5

Estaba hablando de redes neuronales (NN) con un amigo durante el almuerzo el otro día y afirmó que el rendimiento de una NN escrita en Java sería similar a la escrita en C++. Sé que con las técnicas de compilación "justo a tiempo" Java puede funcionar muy bien, pero de alguna manera simplemente no lo compro. ¿Alguien tiene alguna experiencia que arroje luz sobre este tema? This page es el alcance de mi lectura sobre el tema.Rendimiento en C++/Java para redes neuronales?

+0

Antes de responder esta pregunta, recuerde que está preguntando por las redes neuronales. Creo que podemos eludir todo el debate sobre el código nativo frente al intérprete si todavía nos ocupamos del tema en cuestión. –

+0

Buena suerte gastando 10 veces más para resolver el mismo problema en C++. –

Respuesta

10

El Hotspot JIT ahora puede producir el código más rápido que C++. El motivo es la optimización empírica en tiempo de ejecución.

Por ejemplo, puede ver que un cierto bucle toma la bifurcación "falsa" el 99% del tiempo y vuelve a ordenar las instrucciones del código de máquina en consecuencia.

Hay muchos artículos sobre esto. Si desea todos los detalles, lea Sun's excellent whitepaper. Para obtener información más informal, try this one.

+0

C++ puede hacer lo mismo con Optmiizations guiadas por perfil. –

+0

Aquí hay una fuente imparcial que muestra que Java es un 19% más lento que C/C++ en un trabajo matemático de precisión doble (vagamente similar a una red neuronal). http://shootout.alioth.debian.org/u32q/benchmark.php?test=nbody&lang=all –

2

Me interesaría una comparación entre Hotspot JIT y optimización guiada por perfil optimizada en C++.

El problema que veo con el Hotspot JIT (y cualquier compilador JIT optimizado para el perfil de tiempo de ejecución) es que las estadísticas deben mantenerse y modificarse el código. Si bien hay casos aislados, esto dará como resultado un código de ejecución más rápida, dudo que los compiladores JIT optimizados para el perfil se ejecuten más rápido que el código C o C++ optimizado en la mayoría de los casos. (Por supuesto que podría estar equivocado.)

De todos modos, generalmente estarás a merced del proyecto más grande, usando el mismo lenguaje en el que está escrito. O estarás a merced del conocimiento base de tus compañeros de trabajo. O estará a merced de la plataforma a la que se dirige (¿hay una JVM disponible en la arquitectura a la que se dirige?). En el raro caso de que tenga total libertad y esté familiarizado con ambos idiomas, haga algunas comparaciones con las herramientas que tiene a su disposición. Esa es realmente la única forma de determinar qué es lo mejor.

+0

Tenga en cuenta que también puede realizar una optimización guiada por perfil del código de Java, por lo que para ser justos debe realizar un guiado de perfil en ambos o ninguno. –

+0

Oh, claro, pero Hotsopt JIT está guiado por perfiles (solo guiado en tiempo de ejecución). Todo lo que estaba diciendo es que el HIT de Hotspot realmente debería compararse con la compilación de C o C++ guiada por perfil (que es exactamente lo que usted argumenta en su comentario). – Kevin

0

Esto no se trata estrictamente del rendimiento de C++ frente a Java, pero no obstante es interesante en ese aspecto: A paper sobre el rendimiento de los programas que se ejecutan en un entorno recolectado de basura.

2

La única respuesta posible es: haga un prototipo y mida usted mismo. Si mi experiencia es de interés, Java y C# fueron siempre mucho más lentas que C++ para el tipo de trabajo que estaba haciendo, creo principalmente por el alto consumo de memoria. Por supuesto, puedes llegar a una conclusión completamente diferente.

0

Si la recolección excesiva de basura es una preocupación, siempre puede reutilizar objetos no utilizados de alta rotación.

Crea una fábrica que mantiene una cola de SoftReferences a los objetos reciclados, usándolos antes de crear objetos nuevos. Luego, en el código que utiliza estos objetos, devuelva explícitamente estos objetos a la fábrica para su reciclaje.

-1

En el gran esquema de cosas, estás debatiendo tal vez una diferencia de rendimiento del 5% donde obtendrías varios órdenes de magnitud aumentar al mudarte a CUDA o hardware dedicado.

0

Probablemente C++, aunque creo que apenas notará la diferencia además de un tiempo de inicio lento. Sin embargo, Java hace que el desarrollo sea más rápido y el mantenimiento más fácil.

Cuestiones relacionadas