Autor
|
Tema: Java vs C comparable en tiempo? (Leído 6,757 veces)
|
engel lex
|
hola! siempre había pensado que Java sería mucho más lento que C... pero estuve haciendo pruebas y rebate mi teoría a un punto despreciable... no se si es error mio o que, pero compilo el código que pondré a continuación en Java y en C y el tiempo es MUY similar (diferencia menos de 10%) antes que nada quisiera dejar claro que no se Java... hice la conversión como pude... quisiera que uds opinaran, me dijeran si mi método de evaluación está mal o si solo eran mis creencias... los pongo a competir en algo donde pueden pelear con características tan similares como sea posible... calculando n números primos... y haciendo ambos códigos tan idénticos como es posible... dejo a continuación mis pruebas a 1.000.000 de primos generados y almacenados en el array, C tarda en promedio 23 segundos y Java 25... El codigo en C #include <stdio.h> #include <stdlib.h> #include <time.h> int es_primo(long numero); int main(int argc, char** argv) { clock_t startTime = clock(); int cantidad = 1000000; int encontrados = 0; long numero = 1; long primos[cantidad]; while(encontrados < cantidad){ numero++; if(es_primo(numero)){ primos[encontrados++] = numero; } } clock_t endTime = clock(); /* int i; for(i=0;i<cantidad; i++){ printf("%d-",primos[i]); } */ printf("pasaron %d millisegundos",(endTime -startTime )/1000); return (EXIT_SUCCESS); } int es_primo(long numero){ long control_for = 0; if(numero <= 3) return 1; if(numero % 2 == 0 ||numero % 3 == 0) return 0; for(control_for = 5; numero > control_for * control_for; control_for+=6){ if(numero % control_for == 0 || numero % (control_for + 2)==0) return 0; } return 1; }
el codigo en java package numerosprimos; import java.util.*; import java.lang.*; import java.io.*; public class NumerosPrimos { public static void main (String[] args ){ long startTime = System. currentTimeMillis(); int cantidad = 1000000; int encontrados = 0; long numero = 1; long[] primos = new long[cantidad]; while(encontrados < cantidad){ numero++; if(es_primo(numero)){ primos[encontrados++] = numero; } } long endTime = System. currentTimeMillis(); //System.out.println(Arrays.toString(primos)); System. out. println("pasaron: " + (endTime - startTime ) + " millisegundos"); } public static boolean es_primo(long numero){ long control_for = 0; if(numero <= 3) return true; if(numero % 2 == 0 ||numero % 3 == 0) return false; for(control_for = 5; numero > control_for * control_for; control_for+=6){ if(numero % control_for == 0 || numero % (control_for + 2)==0) return false; } return true; } }
|
|
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
MinusFour
|
hola! siempre había pensado que Java sería mucho más lento que C... pero estuve haciendo pruebas y rebate mi teoría a un punto despreciable... no se si es error mio o que, pero compilo el código que pondré a continuación en Java y en C y el tiempo es MUY similar (diferencia menos de 10%) antes que nada quisiera dejar claro que no se Java... hice la conversión como pude... quisiera que uds opinaran, me dijeran si mi método de evaluación está mal o si solo eran mis creencias... los pongo a competir en algo donde pueden pelear con características tan similares como sea posible... calculando n números primos... y haciendo ambos códigos tan idénticos como es posible... dejo a continuación mis pruebas a 1.000.000 de primos generados y almacenados en el array, C tarda en promedio 23 segundos y Java 25... El codigo en C #include <stdio.h> #include <stdlib.h> #include <time.h> int es_primo(long numero); int main(int argc, char** argv) { clock_t startTime = clock(); int cantidad = 1000000; int encontrados = 0; long numero = 1; long primos[cantidad]; while(encontrados < cantidad){ numero++; if(es_primo(numero)){ primos[encontrados++] = numero; } } clock_t endTime = clock(); /* int i; for(i=0;i<cantidad; i++){ printf("%d-",primos[i]); } */ printf("pasaron %d millisegundos",(endTime -startTime )/1000); return (EXIT_SUCCESS); } int es_primo(long numero){ long control_for = 0; if(numero <= 3) return 1; if(numero % 2 == 0 ||numero % 3 == 0) return 0; for(control_for = 5; numero > control_for * control_for; control_for+=6){ if(numero % control_for == 0 || numero % (control_for + 2)==0) return 0; } return 1; }
el codigo en java package numerosprimos; import java.util.*; import java.lang.*; import java.io.*; public class NumerosPrimos { public static void main (String[] args ){ long startTime = System. currentTimeMillis(); int cantidad = 1000000; int encontrados = 0; long numero = 1; long[] primos = new long[cantidad]; while(encontrados < cantidad){ numero++; if(es_primo(numero)){ primos[encontrados++] = numero; } } long endTime = System. currentTimeMillis(); //System.out.println(Arrays.toString(primos)); System. out. println("pasaron: " + (endTime - startTime ) + " millisegundos"); } public static boolean es_primo(long numero){ long control_for = 0; if(numero <= 3) return true; if(numero % 2 == 0 ||numero % 3 == 0) return false; for(control_for = 5; numero > control_for * control_for; control_for+=6){ if(numero % control_for == 0 || numero % (control_for + 2)==0) return false; } return true; } }
Edit: Me doy cuenta que la resolucion de los dos numeros estan en Milisegundos! Bueno aqui hay un error nada mas con lo de los primos: for(control_for = 5; numero > (control_for * control_for); control_for+=6){
El cuadrado de los primos devuelve que es primo porque el cuadrado de los primos tecnicamente no es menor al cuadrado de los primos.
|
|
« Última modificación: 25 Enero 2015, 07:25 am por MinusFour »
|
En línea
|
|
|
|
engel lex
|
printf("pasaron %d millisegundos",(endTime -startTime )/1000);
Prueba: printf("pasaron %f millisegundos",((double)(endTime -startTime ))/CLOCKS_PER_SEC );
for(control_for = 5; numero > (control_for * control_for); control_for+=6){
El cuadrado de los primos devuelve que es primo porque el cuadrado de los primos tecnicamente no es menor al cuadrado de los primos. realmente la doble precisión es poco importante en este caso, y el compilador (netbeans) me muestra el tiempo de ejecución, siendo similar al del ejecutable, fijate que incluso lo imprimo sin decimales porque no los quería :s (los decimales representarían menos de 1/1000% de diferencia ya que los tiempos manejados están en el orden de >20segundos) sobre el ciclo tienes razón... se me pasó esa comparacion... igual, haciendo los cambios cambiando la linea 35 tanto de C y la 32 de Java a for(control_for = 5; numero >= control_for * control_for; control_for+=6){
y cambiando en C la linea 26 a printf("pasaron %.2f millisegundos",(double)(endTime -startTime )/1000);
sigo teniendo un margen de (a 1.000.000 de primos) C con 23 segundos y Java con 26 segundos, sigue estando en el orden de 15%... entonces Java hace muy buen trabajo, mucho mejor de la reputación que le dan... o no? mi comparación no toca puntos reales? (me refiero juego solo con velocidad de procesamiento y eficiencia de asignación a memoria que es con lo que juego aquí)
|
|
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
MinusFour
|
realmente la doble precisión es poco importante en este caso, y el compilador (netbeans) me muestra el tiempo de ejecución, siendo similar al del ejecutable, fijate que incluso lo imprimo sin decimales porque no los quería :s (los decimales representarían menos de 1/1000% de diferencia ya que los tiempos manejados están en el orden de >20segundos) sobre el ciclo tienes razón... se me pasó esa comparacion... igual, haciendo los cambios cambiando la linea 35 tanto de C y la 32 de Java a for(control_for = 5; numero >= control_for * control_for; control_for+=6){
y cambiando en C la linea 26 a printf("pasaron %.2f millisegundos",(double)(endTime -startTime )/1000);
sigo teniendo un margen de (a 1.000.000 de primos) C con 23 segundos y Java con 26 segundos, sigue estando en el orden de 15%... entonces Java hace muy buen trabajo, mucho mejor de la reputación que le dan... o no? mi comparación no toca puntos reales? (me refiero juego solo con velocidad de procesamiento y eficiencia de asignación a memoria que es con lo que juego aquí) Realmente no me habia dado cuenta de la resolucion de tiempo, que es milisegundos. (CLOCK_PER_SEC son microsegundos). Realmente si corres el codigo de Java sin ser optimizado por la maquina virtual: ╭─m1n054@ALEXPC ~/d/java ╰─ ❯❯❯ java -Xint NumerosPrimos ⏎ pasaron: 22911 millisegundos Optimizado: ╭─m1n054@ALEXPC ~/d/java ╰─ ❯❯❯ java NumerosPrimos pasaron: 8174 millisegundos Sin optimizar en C: ╭─m1n054@ALEXPC ~/d/gcc ╰─ ❯❯❯ ./ex2
Encontramos 1000000 numeros primos Tiempo elapsado: 8515.194000 Optimizado en C (-Ofast): ╭─m1n054@ALEXPC ~/d/gcc ╰─ ❯❯❯ ./ex2
Encontramos 1000000 numeros primos Tiempo elapsado: 7422.899000 No estoy seguro del costo de las optimizaciones por el JRE pero para C deben ser nulas (bueno, tecnicamente tarda mas en compilar).
|
|
« Última modificación: 25 Enero 2015, 08:04 am por MinusFour »
|
En línea
|
|
|
|
engel lex
|
uff como se nota que tienes algo decente en relacion a mi perolita que recien revivió en estos dias jejeje Encontramos 1000000 numeros primos Tiempo elapsado: 7422.899000 en relación a 23 segundos para mi jejeje No estoy seguro del costo de las optimizaciones por el JRE pero para C deben ser nulas. a que te refieres con "el costo"?
|
|
|
En línea
|
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
|
|
|
MinusFour
|
uff como se nota que tienes algo decente en relacion a mi perolita que recien revivió en estos dias jejeje
en relación a 23 segundos para mi jejeje
a que te refieres con "el costo"?
Tiempo, memoria, uso de cpu, etc.
|
|
|
En línea
|
|
|
|
Usuario Invitado
Desconectado
Mensajes: 625
|
Según tengo entendido, Java no utiliza mucho procesador, pero sí algo más de RAM. Por ejemplo, en un algoritmo de árboles binarios, C consume una media de ~150MB y Java puede llegar a consumir ~500MB, Python consume una media de 1.1GB y C++ algo de ~350MB. Aquí pueden ver un benchmark de Java vs C/GCC.
|
|
« Última modificación: 25 Enero 2015, 17:59 pm por Gus Garsaky »
|
En línea
|
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
|
|
|
3n31ch
Desconectado
Mensajes: 445
Grandes conocimientos engendran grandes dudas
|
xDDD a todos les pico el bicho hoy o que?
Me llama mucho la atención este tema por el simple hecho de que yo ayer estaba haciendo pruebas de lo mismo.
Hablando con Gus Garsaky que me comento las facilidades de JavaFX. Me llamo la atención. me puse a ver un poco mas del lenguaje, lo había dejado de lado por C++,... y bueno realice algunas pruebas, y quede sorprendido. Sabia que lo de Java "lento" era un mito, pero nunca pensé que fuera tan falso, al fin y al cabo corre sobre una maquina virtual por así decirlo.
Nose si se animan a intentar hacer una tabla con distintos lenguajes, Python, PHP, Java, C++, C entre otros (obviamente también intentare hacerlo) para ver la comparativa, no se ustedes, pero a mi me empezó a llamar mucho la atención el tema.
|
|
« Última modificación: 25 Enero 2015, 18:36 pm por Nac-ho »
|
En línea
|
|
|
|
El Benjo
|
Creo que ya una vez habíamos tratado un tema similar. La respuesta de por qué JAVA se ejecuta de manera tan rápida aunque trabaje en una maquina virtual es muy sencilla: La máquina virtual lo que hace es compilar el código intermedio de JAVA cada que se ejecuta la aplicación y después este código compilado corre de forma normal sobre la máquina. Es el mismo procedimiento todos los llamados "lenguajes manejados", como el .NET de microsoft. Es decir que la máquina virtual de JAVA no es un intérprete en tiempo de ejecución, sino un intérprete en tiempo de compilación. Aquí les dejo un enlace para los que quieran una comparación de velocidad entre algunos lenguajes. (Me impresiona lo rápido que se ejecuta FORTRAN) http://www.codeproject.com/Articles/304935/Operation-Performance-Evaluation
|
|
|
En línea
|
www.es.neftis-ai.comSí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.
|
|
|
robertofd1995
Desconectado
Mensajes: 172
|
Es el lenguaje con el que programan los airbus , yo cuando me entere me quede O.O
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
java tiempo real
Sugerencias y dudas sobre el Foro
|
alfredobolson
|
1
|
2,657
|
20 Octubre 2004, 22:48 pm
por Karcsi
|
|
|
Código de intervalos de tiempo(java)
Java
|
knightlain
|
0
|
18,686
|
20 Octubre 2006, 18:34 pm
por knightlain
|
|
|
Problemas de tiempo y ficheros en java.
Java
|
maikmilk
|
6
|
4,462
|
1 Junio 2012, 13:36 pm
por maikmilk
|
|
|
Cambio de Tono de voz en tiempo real en java
Java
|
pablitojapa
|
0
|
1,353
|
14 Diciembre 2013, 02:05 am
por pablitojapa
|
|
|
Qué tiempo de vida le queda a Java 7?
Java
|
NikNitro!
|
4
|
3,417
|
24 Agosto 2014, 23:20 pm
por NikNitro!
|
|