Položili jste si někdy otázku, jak by dopadlo výkonové srovnání Javy a C? V tomto krátkém článku si jedno výkonové srovnání ukážeme. Nepůjde však o komplexní srovnání Javy a C, protože budeme testovat jen jednu funkci: výpočet obsahu kruhu.

V Javě bude obsah kruhu počítat metoda obsah:

public static double obsah(double r) {
   return 3.141592 * r * r;
}

V C to bude funkce obsah:

double obsah(double r)
{
    return 3.141592 * r * r;
}

Protože jedno vykonání metody (či funkce) trvá velmi krátkou dobu, budeme metodu (či funkci) volat v cyklu:

d = 0.0;
while (d < 10000000.0) {
   d += 0.1;
   obsah(d);
}

Zajímá nás, jak dlouho trvá výpočet obsahu kruhu. Proto nejprve změříme čas provádění smyčky while bez volání metody obsah a pak s ním. Obě měření provedeme v metodě test:

public static void test() {
   double d = 0.0;
   long start = System.nanoTime();
   while (d < 10000000.0) {
      d += 0.1;
   }
   long end = System.nanoTime();
   long ms = (end - start) / 1000000;
   System.out.println("empty loop: " + ms + "ms");
   d = 0.0;
   start = System.nanoTime();
   while (d < 10000000.0) {
      d += 0.1;
      obsah(d);
   }
   end = System.nanoTime();
   ms = (end - start) / 1000000;
   System.out.println("time: " + ms + "ms");
}

V jazyce C budeme měřit ve funkci test:

void test() {
   double d = 0.0;
   hrtime_t start, end;
   long int ms;
   start = gethrtime();
   while (d < 10000000.0) {
      d += 0.1;
   }
   end = gethrtime();
   ms = (end - start) / 1000000;
   printf("empty loop: %ldms\n", ms);
   d = 0.0;
   start = gethrtime();
   while (d < 10000000.0)
   {
      d += 0.1;
      obsah(d);
   }
   end = gethrtime();
   ms = (end - start) / 1000000;
   printf("time: %ldms\n", ms);
}

Zbývá už jen metodu či funkci test zavolat (zavoláme ji 2x), zdrojáky přeložit a spustit. Javovský zdroják jsem přeložil Sunovským JDK 1.6.0 a Céčko jsem přeložil překladačem gcc s přepínačem -Wall. Obojí na Solarisu 9.

A výsledek? Časy se vždy malinko liší, nicméně opravdu jen malinko. Dostal jsem např. tyto časy pro C:

empty loop: 13403ms
time: 28805ms
empty loop: 13404ms
time: 28845ms

A tyto časy pro Javu:

empty loop: 10557ms
time: 10539ms
empty loop: 10557ms
time: 8001ms

Chcete-li si měření vyzkoušet, zdrojáky jsou k dispozici zde: Obsah.java a obsah.c.

Poznámka: tento článek byl publikován 1. dubna. Vezměte, prosím, toto v potaz.