neděle 31. prosince 2006

Java 6 – co vězí za zrychlením (mikro benchmark)

V článku Java 6 – co vězí za zrychlením jsme se prokousali teorií a nyní je na čase se podívat na reálný dopad synchronizačních optimalizací.

Abstrakt

Celý benchmark byl koncipován na měření vlivu nové optimalizační techniky JVM zvané lock elision čili vypuštění zbytečných synchronizačních zámků. Pro srovnání výkonu byl zároveň proveden stejný benchmark proti Jave 5 a to včetně zapnutí techniky biased lockingu, která měla snížit synchronizační režii.

Benchmark

Následuje verze benchamrku se zapnutou synchornizací. Pokud se testovalo bez synchronizace, byla použita stejná verze s tím rozdílem, že synchronizační blok byl zakomentován.

public class TestSynOptimizations {
    public static void main(final String args[]) {
        for (int i = 0; i < 10; i++) {
            long startTime = System.nanoTime();
            for (int j = 0; j < 30000; j++) {
                compute();
            }
            long delta = System.nanoTime() - startTime;
            System.out.println("Total time [ns]:" + delta);
        }
    }

    public static void compute() {
        Object lock = new Object();
        int sum = 0;
        for (int j = 0; j < 5; j++) {
            synchronized (lock) {
                sum = sum + 1;
            }
        }
    }
}

Kód metody compute je koncipován tak, aby umožnil HotSpotu provedení odstranění zámku. Tím pádem by se měl setřít rozdíl mezi synchronizovanou nesynchornizovanou verzí.

Měřící prostředí

  • HW notebook Dell D610
  • CPU Intel Pentium M 760 (2.00Ghz w/ 533Mhz FSB)
  • RAM 2048 MB (dual channel)
  • OS Microsoft Windows XP Professional SP 2

Měření proběhlo na Jave 1.6.0-b105 a 1.5.0_10-b03 v HotSpot módu server a vyhrazená velikost heapu byla nastavena v rozmezí 256MB - 128MB (eliminace vlivu GC). Pro každou verzi Javy byl benchmark zkompilován příslušnou verzí kompilátoru. Benchmark byl spouštěn v následujících verzích a konfiguracích JVM (sync a nosync rozlišuje jestli byla v kódu benchmarku použita synchronizace).

  • Java 6.0, sync
  • Java 6.0, sync,-XX:+DoEscapeAnalysis
  • Java 1.5.0_10, sync, -XX:+UseBiasedLocking
  • Java 1.5.0_10, sync
  • Java 6.0, nosync
  • Java 1.5.0_10,nosync

Poznámka ke konfiguraci JVM

  • -XX:+DoEscapeAnalysis zapíná (defaultně vypnuto) od Javy 6 analýzu nutnou k provedení odstranění zámku.
  • -XX:+UseBiasedLocking zapína biased locking (dostupné i v Jave 5 od aktualizace 06)

Naměřené hodnoty

Následující tabulka obsahuje výsledky měření po jednotlivých měřících iteracích. Iterace je průchod tělem nejvyššího cyklu v metodě main. Poslední dva řádky tabulky obsahuje průměrné hodnoty, s tím rozdílem, že poslední řádek nemá do průměru započtené první dvě iterace, které jsou skreslující díky práci HotSpotu.

Výsledky měření
Plná velikost obrázku (cca. 37KB).

Naměřené výsledky v grafu

Výsledky měření
Plná velikost obrázku (cca. 22KB).

První graf je výrazně zkreslený optimalizací HotSpotu, která probíhala během prvních dvouch iteracích, proto má mnohem přesnější vypovídající hodontu graf číslo dva. Z výsledků jasně vyplývá, že odstranění zbytečných zámků v Jave 6 funguje. Rychlost synchronizované verze se zapnutou escape analýzou je totiž stejná s rychlostí nesynchronizované verze. Zajímavý je vliv biased lockingu v Jave 5, který rychlost posouvá na stejnou úroveň synchronizované verze Javy 6.0. Z tohoto výsledku se dá vyvodit, že v Jave 6.0 je biased locking zapnutý defaultně.

Bohužel nemám po ruce žádné konkrétní čísla dopadu těchto synchronizačních optimalizací na reálné aplikace. Schválně říkám reálné, protože vypovídající hodnota tohoto mikro benchmarku slouží spíše k ověření teoretických předpokladů. Nicméně i podle těchto výsledků bych si troufl říci, že pro většinu aplikací přináší Java 6 v podstatě zdarma solidní výkonnostní nárůst.

Tabulku s naměřenými hodnotami a grafy můžete také najít v PDF dokumentu, který je přece jenom vhodnějším médiem pro prezentaci naměřených dat.

Aktualizace: v článku Lži, větší lži a mikrobenchmarky:) uvádí Jarda Kameník na pravou míru jak je to s měřením nesynchronizované verze.