Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien zum Buch
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichen und Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Schnittstellen, Aufzählungen, versiegelte Klassen, Records
9 Ausnahmen müssen sein
10 Geschachtelte Typen
11 Besondere Typen der Java SE
12 Generics<T>
13 Lambda-Ausdrücke und funktionale Programmierung
14 Architektur, Design und angewandte Objektorientierung
15 Java Platform Module System
16 Die Klassenbibliothek
17 Einführung in die nebenläufige Programmierung
18 Einführung in Datenstrukturen und Algorithmen
19 Einführung in grafische Oberflächen
20 Einführung in Dateien und Datenströme
21 Einführung ins Datenbankmanagement mit JDBC
22 Bits und Bytes, Mathematisches und Geld
23 Testen mit JUnit
24 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil 16 Die Klassenbibliothek
Pfeil 16.1 Die Java-Klassenphilosophie
Pfeil 16.1.1 Modul, Paket, Typ
Pfeil 16.1.2 Übersicht über die Pakete der Standardbibliothek
Pfeil 16.2 Einfache Zeitmessung und Profiling *
Pfeil 16.3 Die Klasse Class
Pfeil 16.3.1 An ein Class-Objekt kommen
Pfeil 16.3.2 Eine Class ist ein Type
Pfeil 16.4 Klassenlader
Pfeil 16.4.1 Die Klasse java.lang.ClassLoader
Pfeil 16.5 Die Utility-Klassen System und Properties
Pfeil 16.5.1 Speicher der JVM
Pfeil 16.5.2 Anzahl der CPUs bzw. Kerne
Pfeil 16.5.3 Systemeigenschaften der Java-Umgebung
Pfeil 16.5.4 Eigene Properties von der Konsole aus setzen *
Pfeil 16.5.5 Zeilenumbruchzeichen, line.separator
Pfeil 16.5.6 Umgebungsvariablen des Betriebssystems
Pfeil 16.6 Sprachen der Länder
Pfeil 16.6.1 Sprachen in Regionen über Locale-Objekte
Pfeil 16.7 Wichtige Datum-Klassen im Überblick
Pfeil 16.7.1 Der 1.1.1970
Pfeil 16.7.2 System.currentTimeMillis()
Pfeil 16.7.3 Einfache Zeitumrechnungen durch TimeUnit
Pfeil 16.8 Date-Time-API
Pfeil 16.8.1 Menschenzeit und Maschinenzeit
Pfeil 16.8.2 Die Datumsklasse LocalDate
Pfeil 16.9 Logging mit Java
Pfeil 16.9.1 Logging-APIs
Pfeil 16.9.2 Logging mit java.util.logging
Pfeil 16.10 Maven: Build-Management und Abhängigkeiten auflösen
Pfeil 16.10.1 Beispielprojekt in Eclipse mit Maven
Pfeil 16.10.2 Properties hinzunehmen
Pfeil 16.10.3 Dependency hinzunehmen
Pfeil 16.10.4 Lokales und das Remote-Repository
Pfeil 16.10.5 Lebenszylus, Phasen und Maven-Plugins
Pfeil 16.10.6 Archetypes
Pfeil 16.11 Zum Weiterlesen
 

Zum Seitenanfang

16.2    Einfache Zeitmessung und Profiling * Zur vorigen ÜberschriftZur nächsten Überschrift

Neben den komfortablen Klassen zum Verwalten von Datumswerten gibt es mit zwei statischen Methoden einfache Möglichkeiten, Zeiten für Programmabschnitte zu messen:

final class java.lang.System
  • static long currentTimeMillis()

    Gibt die seit dem 1.1.1970, 00:00:00 UTC vergangenen Millisekunden zurück.

  • static long nanoTime()

    Liefert die Zeit vom genauesten System-Zeitgeber. Sie hat keinen Bezugspunkt zu irgendeinem Datum.

Die Differenz zweier Zeitwerte kann zur groben Abschätzung der Ausführungszeiten von Programmen dienen:

Listing 16.1     com/tutego/insel/lang/Profiling.java

package com.tutego.insel.lang;



import static java.util.concurrent.TimeUnit.NANOSECONDS;

import java.util.Arrays;

import java.util.function.Supplier;

import java.util.function.ToLongFunction;



class Profiling {



final static String ANGIE =

"Aber Angie, Angie, ist es nicht an der Zeit, Goodbye zu sagen? " +

"Ohne Liebe in unseren Seelen und ohne Geld in unseren Mänteln. " +

"Du kannst nicht sagen, dass wir zufrieden sind.";



final static int MAX = 10000;



enum Algorithm {

STRING_BUILDER1( () -> { // StringBuffer(size) und append() zur Konkatenation

StringBuilder sb = new StringBuilder( 2 * MAX * ANGIE.length() );

for ( int i = MAX; i-- > 0; )

sb.append( ANGIE ).append( ANGIE );

return sb.toString().length();

} ),

STRING_BUILDER2( () -> { // StringBuffer und append() zur Konkatenation

StringBuilder sb = new StringBuilder();

for ( int i = MAX; i-- > 0; )

sb.append( ANGIE ).append( ANGIE );

return sb.toString().length();

} ),

STRING_PLUS( () -> { // + zur Konkatenation

String s = "";

for ( int i = MAX; i-- > 0; )

s += ANGIE + ANGIE;

return s.length();

} );



private final Supplier<Integer> supplier;

private Algorithm( Supplier<Integer> supplier ) { this.supplier = supplier; }

int perform() { return supplier.get(); }

}



private static long[] measure() {

ToLongFunction<Algorithm> duration = algorithm -> {

long startTime = System.nanoTime();

int result = algorithm.perform();

try { return NANOSECONDS.toMillis( System.nanoTime() - startTime ); }

finally { System.out.println( result ); }

};

return Arrays.stream( Algorithm.values() ).mapToLong( duration ).toArray();

}



public static void main( String[] args ) {

measure(); System.gc(); measure(); System.gc();

long[] durations = measure();



System.out.printf( "sb(size), append(): %d ms%n", durations[0] );

// sb(size), append(): 6 ms

System.out.printf( "sb(), append() : %d ms%n", durations[1] );

// sb(), append() : 9 ms

System.out.printf( "t+= : %d ms%n", durations[2] );

// t+= : 15982 ms

}

}

Das Testprogramm hängt Zeichenfolgen mit

  • einem StringBuilder, der nicht in der Endgröße initialisiert ist,

  • einem StringBuilder, der eine vorinitialisierte Endgröße nutzt, und

  • dem Plus-Operator von Strings zusammen.

Vor der Messung gibt es zwei Testläufe und ein System.gc(), das die automatische Speicherbereinigung (GC) anweist, Speicher freizugeben. (Das würde in gewöhnlichen Programmen nicht stehen, da der Garbage-Collector schon selbst ganz gut weiß, wann Speicher freizugeben ist. Nur kostet das Freigeben auch Ausführungszeit, und es würde die Messzeiten beeinflussen, was wir hier nicht wollen.)

Auf meinem Rechner (JDK 10) liefert das Programm diese Ausgabe:

sb(size), append(): 7 ms

sb(), append() : 9 ms

t+= : 15982 ms

Das Ergebnis: Bei großen Anhängeoperationen ist es nur unwesentlich besser, einen passend in der Größe initialisierten StringBuilder zu benutzen. Über das + entstehen viele temporäre Objekte, was wirklich teuer kommt. Da in Java 9 die Konkatenation von Strings über den Plus-Operator beschleunigt wurde, sind die Zeiten besser als unter Java 8, wo die Ausführungszeit bei 41.262 ms liegt.

[+]  Tipp

Die Werte von nanoTime() sind immer aufsteigend, was für currentTimeMillis() nicht zwingend gelten muss, da sich Java die Zeit vom Betriebssystem holt, und da kann sich die Systemzeit ändern, etwa wenn der Benutzer die Zeit anpasst. Differenzen von currentTimeMillis()-Zeitstempeln sind dann komplett falsch und könnten sogar negativ sein.

Profiler

Wo die JVM im Programm überhaupt Taktzyklen verschwendet, zeigt ein Profiler. An diesen Stellen kann dann mit der Optimierung begonnen werden. Java Mission Control ist ein leistungsfähiges Programm des JDK und integriert einen freien Profiler. Java VisualVM ist ein weiteres freies Programm, dass unter https://visualvm.github.io/ bezogen werden kann. Auf der professionellen und kommerziellen Seite stehen sich JProfiler (https://www.ej-technologies.com/products/jprofiler/overview.html) und YourKit (https://www.yourkit.com/java/profiler) gegenüber. Die Ultimate Version von IntelliJ enthält ebenfalls einen Profiler.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Spring Boot 3 und Spring Framework 6

Spring Boot 3 und Spring Framework 6




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2024

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.

Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern