Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: engel lex en 25 Enero 2015, 05:47 am



Título: Java vs C comparable en tiempo?
Publicado por: engel lex en 25 Enero 2015, 05:47 am
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
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int es_primo(long numero);
  6.  
  7. int main(int argc, char** argv) {
  8.    clock_t startTime = clock();
  9.    int cantidad = 1000000;
  10.    int encontrados = 0;
  11.    long numero = 1;
  12.    long primos[cantidad];
  13.    while(encontrados < cantidad){
  14.        numero++;
  15.        if(es_primo(numero)){
  16.            primos[encontrados++] = numero;
  17.        }
  18.    }
  19.    clock_t endTime = clock();
  20.    /*
  21.     int i;
  22.     for(i=0;i<cantidad; i++){
  23.         printf("%d-",primos[i]);
  24.     }
  25.     */
  26.    printf("pasaron %d millisegundos",(endTime-startTime)/1000);
  27.  
  28.  
  29.    return (EXIT_SUCCESS);
  30. }
  31. int es_primo(long numero){
  32.    long control_for = 0;
  33.    if(numero <= 3) return 1;
  34.    if(numero % 2 == 0 ||numero % 3 == 0) return 0;
  35.    for(control_for = 5; numero > control_for * control_for; control_for+=6){
  36.        if(numero % control_for == 0 || numero % (control_for + 2)==0) return 0;
  37.    }
  38.    return 1;
  39.    }

el codigo en java
Código
  1. package numerosprimos;
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. public class NumerosPrimos {
  8.  
  9.    public static void main (String[] args){
  10.  
  11.        long startTime = System.currentTimeMillis();
  12.        int cantidad = 1000000;
  13.        int encontrados = 0;
  14.        long numero = 1;
  15.        long[] primos = new long[cantidad];
  16.        while(encontrados < cantidad){
  17.            numero++;
  18.            if(es_primo(numero)){
  19.                primos[encontrados++] = numero;
  20.            }
  21.  
  22.        }
  23.        long endTime = System.currentTimeMillis();
  24.        //System.out.println(Arrays.toString(primos));
  25.        System.out.println("pasaron: " + (endTime - startTime) + " millisegundos");
  26.  
  27.    }
  28.    public static boolean es_primo(long numero){
  29.        long control_for = 0;
  30.        if(numero <= 3) return true;
  31.        if(numero % 2 == 0 ||numero % 3 == 0) return false;
  32.        for(control_for = 5; numero > control_for * control_for; control_for+=6){
  33.            if(numero % control_for == 0 || numero % (control_for + 2)==0) return false;
  34.        }
  35.        return true;
  36.    }
  37.  
  38. }


Título: Re: Java vs C comparable en tiempo?
Publicado por: MinusFour en 25 Enero 2015, 07:16 am
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
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. int es_primo(long numero);
  6.  
  7. int main(int argc, char** argv) {
  8.    clock_t startTime = clock();
  9.    int cantidad = 1000000;
  10.    int encontrados = 0;
  11.    long numero = 1;
  12.    long primos[cantidad];
  13.    while(encontrados < cantidad){
  14.        numero++;
  15.        if(es_primo(numero)){
  16.            primos[encontrados++] = numero;
  17.        }
  18.    }
  19.    clock_t endTime = clock();
  20.    /*
  21.     int i;
  22.     for(i=0;i<cantidad; i++){
  23.         printf("%d-",primos[i]);
  24.     }
  25.     */
  26.    printf("pasaron %d millisegundos",(endTime-startTime)/1000);
  27.  
  28.  
  29.    return (EXIT_SUCCESS);
  30. }
  31. int es_primo(long numero){
  32.    long control_for = 0;
  33.    if(numero <= 3) return 1;
  34.    if(numero % 2 == 0 ||numero % 3 == 0) return 0;
  35.    for(control_for = 5; numero > control_for * control_for; control_for+=6){
  36.        if(numero % control_for == 0 || numero % (control_for + 2)==0) return 0;
  37.    }
  38.    return 1;
  39.    }

el codigo en java
Código
  1. package numerosprimos;
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. public class NumerosPrimos {
  8.  
  9.    public static void main (String[] args){
  10.  
  11.        long startTime = System.currentTimeMillis();
  12.        int cantidad = 1000000;
  13.        int encontrados = 0;
  14.        long numero = 1;
  15.        long[] primos = new long[cantidad];
  16.        while(encontrados < cantidad){
  17.            numero++;
  18.            if(es_primo(numero)){
  19.                primos[encontrados++] = numero;
  20.            }
  21.  
  22.        }
  23.        long endTime = System.currentTimeMillis();
  24.        //System.out.println(Arrays.toString(primos));
  25.        System.out.println("pasaron: " + (endTime - startTime) + " millisegundos");
  26.  
  27.    }
  28.    public static boolean es_primo(long numero){
  29.        long control_for = 0;
  30.        if(numero <= 3) return true;
  31.        if(numero % 2 == 0 ||numero % 3 == 0) return false;
  32.        for(control_for = 5; numero > control_for * control_for; control_for+=6){
  33.            if(numero % control_for == 0 || numero % (control_for + 2)==0) return false;
  34.        }
  35.        return true;
  36.    }
  37.  
  38. }

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:

Código
  1. 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.


Título: Re: Java vs C comparable en tiempo?
Publicado por: engel lex en 25 Enero 2015, 07:39 am
Código
  1. printf("pasaron %d millisegundos",(endTime-startTime)/1000);

Prueba:

Código
  1. printf("pasaron %f millisegundos",((double)(endTime-startTime))/CLOCKS_PER_SEC);



Código
  1. 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
Código
  1. for(control_for = 5; numero >= control_for * control_for; control_for+=6){

y cambiando en C la linea 26 a
Código
  1. 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í)


Título: Re: Java vs C comparable en tiempo?
Publicado por: MinusFour en 25 Enero 2015, 07:54 am
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
Código
  1. for(control_for = 5; numero >= control_for * control_for; control_for+=6){

y cambiando en C la linea 26 a
Código
  1. 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:

Código:
╭─m1n054@ALEXPC ~/d/java
╰─ ❯❯❯ java -Xint NumerosPrimos                                                                                                                                                                                ⏎
pasaron: 22911 millisegundos

Optimizado:
Código:
╭─m1n054@ALEXPC ~/d/java
╰─ ❯❯❯ java NumerosPrimos
pasaron: 8174 millisegundos

Sin optimizar en C:
Código:
╭─m1n054@ALEXPC ~/d/gcc
╰─ ❯❯❯ ./ex2

Encontramos 1000000 numeros primos
 Tiempo elapsado: 8515.194000

Optimizado en C (-Ofast):
Código:
╭─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).


Título: Re: Java vs C comparable en tiempo?
Publicado por: engel lex en 25 Enero 2015, 08:04 am
uff como se nota que tienes algo decente en relacion a mi perolita que recien revivió en estos dias jejeje

Citar
Encontramos 1000000 numeros primos
 Tiempo elapsado: 7422.899000

en relación a 23 segundos para mi jejeje

Citar
No estoy seguro del costo de las optimizaciones por el JRE pero para C deben ser nulas.

a que te refieres con "el costo"?


Título: Re: Java vs C comparable en tiempo?
Publicado por: MinusFour en 25 Enero 2015, 08:18 am
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.


Título: Re: Java vs C comparable en tiempo?
Publicado por: Usuario Invitado en 25 Enero 2015, 17:51 pm
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í (http://benchmarksgame.alioth.debian.org/u64q/java.html) pueden ver un benchmark de Java vs C/GCC.



Título: Re: Java vs C comparable en tiempo?
Publicado por: 3n31ch en 25 Enero 2015, 18:15 pm
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.


Título: Re: Java vs C comparable en tiempo?
Publicado por: El Benjo en 26 Enero 2015, 01:43 am
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 (http://www.codeproject.com/Articles/304935/Operation-Performance-Evaluation)


Título: Re: Java vs C comparable en tiempo?
Publicado por: robertofd1995 en 26 Enero 2015, 12:25 pm
(Me impresiona lo rápido que se ejecuta FORTRAN)

http://www.codeproject.com/Articles/304935/Operation-Performance-Evaluation (http://www.codeproject.com/Articles/304935/Operation-Performance-Evaluation)

Es el lenguaje con el que programan los airbus , yo cuando me entere me quede O.O


Título: Re: Java vs C comparable en tiempo?
Publicado por: TheEnmanuelRmrz en 25 Febrero 2015, 18:50 pm
Que tal si comparas Java y C con un programa hecho en Asm y que calcule los números primos mediante la FPU o MMX?

Luego compara los tamaños, el tiempo de compilación (ensamblado), tiempo de ejecución y gasto de memoria.


Título: Re: Java vs C comparable en tiempo?
Publicado por: engel lex en 25 Febrero 2015, 18:58 pm
no lo hago

1- porque no sería C sino asm...
2- porque no trabajo asm hace muchos años y no recuerdo nada

añado---

por otro lado quiero hacerlo por métodos idénticos para que la comparación fuera justa...

---
en tal caso pensaría en hacerlo apuntando hacia el otro lado, un programa con clases y más complejo a ver que tal se comportan en un ambiente más complicado... pero lo he olvidado hacerlo y me ha dado un poquito de pereza jejjee


Título: Re: Java vs C comparable en tiempo?
Publicado por: BEATMASTER en 28 Febrero 2015, 06:21 am
En mi opinion, basicamente depende de para que usaras tu aplicación, si conoces bien los dos lenguajes sabes (y esto no es mito) que con C tienes mas control sobre cosas a bajo nivel, puedes optimizar bastante el uso de memoria y si, en menor medida, pero C sera mas rapido al ejecutar procesos aunque la diferencia nos parezca minima (esto principalmente por los procesadores que tenemos hoy en dia).
Yo desde que hago programas que no es tan "importante" la optimizacion de recursos prefiero java por el simple hecho de que facilita la vida muchisimo, incluso siento que de cierta forma me ha hecho flojo, ya no me imagino teniendo en mente en que procesos reservo memoria y cuales la libero o cosas por el estilo.
Creo que C lo debes usar para software en el que es importante el control de recursos a bajo nivel y el tiempo de ejecucion (así sean 3 segundos) ya que si ejecutas la función 100 veces esos 3 segundos se convierten en 300 y ya no te parecera tan poco tiempo de diferencia entre uno y otro o eso digo yo


Título: Re: Java vs C comparable en tiempo?
Publicado por: ~ Yoya ~ en 28 Febrero 2015, 06:46 am
Todavía sigue el mito que Java es lento...

Java es un lenguaje compilado, al igual que C. Eso si, los objetos en Java tienen un overhead y esto causara que java utilice mucho mas memoria comparado con la misma version en C.

Java - Build anything; Run anywhere; Faster than lightning