elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java vs C comparable en tiempo?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Java vs C comparable en tiempo?  (Leído 6,849 veces)
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Java vs C comparable en tiempo?
« 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. }


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
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Java vs C comparable en tiempo?
« Respuesta #1 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.


« Última modificación: 25 Enero 2015, 07:25 am por MinusFour » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Java vs C comparable en tiempo?
« Respuesta #2 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í)
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
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Java vs C comparable en tiempo?
« Respuesta #3 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).
« Última modificación: 25 Enero 2015, 08:04 am por MinusFour » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Java vs C comparable en tiempo?
« Respuesta #4 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"?
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
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: Java vs C comparable en tiempo?
« Respuesta #5 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.
En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Java vs C comparable en tiempo?
« Respuesta #6 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í 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 Desconectado

Mensajes: 445


Grandes conocimientos engendran grandes dudas


Ver Perfil
Re: Java vs C comparable en tiempo?
« Respuesta #7 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.
« Última modificación: 25 Enero 2015, 18:36 pm por Nac-ho » En línea

El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Re: Java vs C comparable en tiempo?
« Respuesta #8 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
En línea

www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.
robertofd1995

Desconectado Desconectado

Mensajes: 172


Ver Perfil
Re: Java vs C comparable en tiempo?
« Respuesta #9 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

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

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
java tiempo real
Sugerencias y dudas sobre el Foro
alfredobolson 1 2,687 Último mensaje 20 Octubre 2004, 22:48 pm
por Karcsi
Código de intervalos de tiempo(java)
Java
knightlain 0 18,696 Último mensaje 20 Octubre 2006, 18:34 pm
por knightlain
Problemas de tiempo y ficheros en java.
Java
maikmilk 6 4,482 Último mensaje 1 Junio 2012, 13:36 pm
por maikmilk
Cambio de Tono de voz en tiempo real en java
Java
pablitojapa 0 1,360 Último mensaje 14 Diciembre 2013, 02:05 am
por pablitojapa
Qué tiempo de vida le queda a Java 7?
Java
NikNitro! 4 3,434 Último mensaje 24 Agosto 2014, 23:20 pm
por NikNitro!
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines