Rheinwerk Computing < openbook >


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


Download:

- Listings, ca. 2,7 MB


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 15 Die Klassenbibliothek
Pfeil 15.1 Die Java-Klassenphilosophie
Pfeil 15.1.1 Modul, Paket, Typ
Pfeil 15.1.2 Übersicht über die Pakete der Standardbibliothek
Pfeil 15.2 Einfache Zeitmessung und Profiling *
Pfeil 15.3 Die Klasse Class
Pfeil 15.3.1 An ein Class-Objekt kommen
Pfeil 15.3.2 Eine Class ist ein Type
Pfeil 15.4 Klassenlader
Pfeil 15.4.1 Die Klasse java.lang.ClassLoader
Pfeil 15.5 Die Utility-Klassen System und Properties
Pfeil 15.5.1 Speicher der JVM
Pfeil 15.5.2 Anzahl der CPUs bzw. Kerne
Pfeil 15.5.3 Systemeigenschaften der Java-Umgebung
Pfeil 15.5.4 Eigene Properties von der Konsole aus setzen *
Pfeil 15.5.5 Zeilenumbruchzeichen, line.separator
Pfeil 15.5.6 Umgebungsvariablen des Betriebssystems
Pfeil 15.6 Sprachen der Länder
Pfeil 15.6.1 Sprachen in Regionen über Locale-Objekte
Pfeil 15.7 Wichtige Datum-Klassen im Überblick
Pfeil 15.7.1 Der 1.1.1970
Pfeil 15.7.2 System.currentTimeMillis()
Pfeil 15.7.3 Einfache Zeitumrechnungen durch TimeUnit
Pfeil 15.8 Date-Time-API
Pfeil 15.8.1 Menschenzeit und Maschinenzeit
Pfeil 15.8.2 Die Datumsklasse LocalDate
Pfeil 15.9 Logging mit Java
Pfeil 15.9.1 Logging-APIs
Pfeil 15.9.2 Logging mit java.util.logging
Pfeil 15.10 Maven: Build-Management und Abhängigkeiten auflösen
Pfeil 15.10.1 Beispielprojekt in Eclipse mit Maven
Pfeil 15.10.2 Properties hinzunehmen
Pfeil 15.10.3 Dependency hinzunehmen
Pfeil 15.10.4 Lokales und das Remote-Repository
Pfeil 15.10.5 Lebenszylus, Phasen und Maven-Plugins
Pfeil 15.10.6 Archetypes
Pfeil 15.11 Zum Weiterlesen
 

Zum Seitenanfang

15.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 15.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, das bis Java 8 integriert war, jetzt allerdings unter http://visualvm.github.io/ bezogen werden muss. Auf der professionellen und kommerziellen Seite stehen sich JProfiler (http://www.ej-technologies.com/products/jprofiler/overview.html) und YourKit (http://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: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




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

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

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