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.
