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.