1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100312.html;106,k100312.html;107,k100314.html;108,k100317.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100314.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100317.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 50 - Performance-Tuning
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id050001"></a>
<h2>50.1 Einleitung </h2>
<hr>
<ul>
<li><a href="k100313.html#sectlevel2id050001">50.1 Einleitung</a>
</ul>
<hr>
<p>
Java gilt gemeinhin als Sprache, die mit Performance-Problemen zu
kämpfen hat. Nicht nur die Ablaufgeschwindigkeit des Compilers
und anderer Entwicklungswerkzeuge, sondern vor allem die der eigenen
Programme läßt oft zu wünschen übrig. Aufgrund
der Plattformunabhängigkeit des vom Compiler generierten Bytecodes
kann dieser normalerweise nicht direkt auf dem jeweiligen Betriebssystem
ausgeführt werden. Er verwendet statt dessen einen eigenen Interpreter,
die <a name="ixa103638"><i>Virtuelle Maschine</i></a> (kurz: VM),
zur Ausführung der erstellten Programme.
<p>
Interpretierter Code wird naturgemäß langsamer ausgeführt
als kompilierter, selbst wenn er in Form von Bytecodes vorliegt. Zwar
ist es prinzipiell möglich, auch Java-Programme in Native-Code
zu übersetzen (es gibt sogar einige kommerzielle Tools, die das
tun), aber dann ist es mit der Plattformunabhängigkeit aus, und
das fertige Programm läuft nur noch auf einem Betriebssystem.
Während das für <i>Applikationen</i> in bestimmten Fällen
akzeptabel sein mag, verbietet sich diese Vorgehensweise für
<i>Applets</i>, die im Internet auf vielen verschiedenen Browsern
und Betriebssystemen laufen müssen, von selbst. Zudem konterkarieren
native-kompilierte Programme die Grundidee der plattformübergreifenden
Binärkompatibilität, die eine der herausragenden Eigenschaften
von Java ist.
<p>
Eine Alternativlösung bieten <a name="ixa103639"><i>Just-In-Time-Compiler</i></a>
(kurz: <a name="ixa103640"><i>JIT</i></a>), deren Entwicklung in großen
Schritten voranschreitet. Ein JIT ist ein Programm, das den Bytecode
von Methoden während der Ausführung des Programms in Maschinencode
der aktuellen Plattform übersetzt und so beim nächsten Aufruf
wesentlich schneller ausführen kann. Vorteilhaft ist dabei, dass
die Klassendateien mit dem Bytecode unverändert ausgeliefert
werden können und das Programm seinen plattformübergreifenden
Charakter erhält. Nur der Just-In-Time-Compiler ist plattformspezifisch
und an ein bestimmtes Betriebssystem gebunden. Nahezu alle Hersteller
kommerzieller Java-Produkte haben mittlerweile einen JIT als festen
Bestandteil ihres Java-Entwicklungssystems eingebunden. Auch SUN liefert
seit dem JDK 1.1.6 den Just-In-Time-Compiler von Symantec als festen
Bestandteil des JDK aus.
<p>
Leider ist auch ein Just-In-Time-Compiler kein Allheilmittel gegen
Performanceprobleme. Zwar ist er in der Lage, bestimmte Codeteile
so stark zu beschleunigen, dass ihre Ablaufgeschwindigkeit der von
kompiliertem C-Code nahekommt. Andererseits gibt es nach wie vor genügend
Möglichkeiten, Programme zu schreiben, die <i>inhärent langsamen</i>
Code enthalten, der auch von einem Just-In-Time-Compiler nicht entscheidend
verbessert werden kann. Zudem ensteht durch den Einsatz des JIT ein
gewisser Overhead, der möglicherweise einen Netto-Performancegewinn
verhindert, denn das Kompilieren des Bytecodes kostet Zeit und zusätzlichen
Speicher.
<p>
Des weiteren ist zu bedenken, dass zur Laufzeit eine Vielzahl von
Checks durchgeführt werden müssen, die die Ablaufgeschwindigkeit
von Java-Programmen vermindert:
<ul>
<li>Array- und String-Zugriffe werden auf Bereichsüberschreitungen
geprüft.
<li>Zeiger werden vor der Dereferenzierung gegen <a href="index_n.html#ixb100235"><font color=#000080><tt>null</tt></font></a>
gecheckt.
<li>Zuweisungen von Objektinstanzen werden auf korrekte Typisierung
geprüft.
<li>Es gibt Checks zu vielen arithmetischen Operationen (Überläufe,
Teilen durch Null usw.).
</ul>
<p>
Am besten ist es daher, bereits während der Entwicklung der Programme
auf die Ablaufgeschwindigkeit des erzeugten Codes zu achten. Wir wollen
uns in diesem Kapitel einige typische Java-Konstrukte ansehen, die
bei unachtsamer Verwendung zu Performance-Problemen führen können.
Gleichzeitig wollen wir Möglichkeiten aufzeigen, wie man mit
alternativem Code den Engpaß umgehen und die Ablaufgeschwindigkeit
des Programms verbessern kann. Wenn man diese Regeln beachtet, ist
es durchaus möglich, in Java größere Programme zu
schreiben, deren Laufzeitverhalten auf aktuellen Rechnern absolut
akzeptabel ist.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Wir wollen uns in diesem Kapitel nicht mit grundlegenden Techniken
der Codeoptimierung beschäftigen. Auch wenn sie zeitweilig kurz
angedeutet werden, können diese Themen besser in Büchern
über Programmiersprachen, Algorithmen oder Optimierungstechniken
für Compiler nachgelesen werden. Auch Tipps & Tricks, die
in aller Regel nur marginale Verbesserungen bringen, oder langsamer
Code, für den keine einfach anzuwendenden Alternativen bekannt
sind, sollen hier nicht behandelt werden. Statt dessen wollen wir
uns auf einige große Themenkomplexe konzentrieren, die leicht
umzusetzen sind und in der Praxis schnell zu Verbesserungen führen.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100314.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100317.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|