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.