Java vs C comparable en tiempo?

Iniciado por engel lex, 25 Enero 2015, 05:47 AM

0 Miembros y 1 Visitante están viendo este tema.

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
Código (java) [Seleccionar]
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;
    }
   
}
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

#1
Cita de: 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
#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
Código (java) [Seleccionar]
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.

engel lex

Cita de: MinusFour en 25 Enero 2015, 07:16 AM

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í)
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

#3
Cita de: engel lex en 25 Enero 2015, 07:39 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
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).

engel lex

uff como se nota que tienes algo decente en relacion a mi perolita que recien revivió en estos dias jejeje

CitarEncontramos 1000000 numeros primos
Tiempo elapsado: 7422.899000

en relación a 23 segundos para mi jejeje

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

a que te refieres con "el costo"?
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

Cita de: 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

en relación a 23 segundos para mi jejeje

a que te refieres con "el costo"?

Tiempo, memoria, uso de cpu, etc.

Usuario Invitado

#6
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.

"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

#7
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.

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
www.es.neftis-ai.com

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

robertofd1995

Cita de: El Benjo en 26 Enero 2015, 01:43 AM
(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