summaryrefslogtreecommitdiffstats
path: root/Master/Reference Architectures and Patterns/hjp5/html/k100313.html
blob: 733a4a3be4db1e35f333b2d41cff5d742a230e5e (plain)
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">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100314.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100317.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</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&auml;mpfen hat. Nicht nur die Ablaufgeschwindigkeit des Compilers
und anderer Entwicklungswerkzeuge, sondern vor allem die der eigenen
Programme l&auml;&szlig;t oft zu w&uuml;nschen &uuml;brig. Aufgrund
der Plattformunabh&auml;ngigkeit des vom Compiler generierten Bytecodes
kann dieser normalerweise nicht direkt auf dem jeweiligen Betriebssystem
ausgef&uuml;hrt werden. Er verwendet statt dessen einen eigenen Interpreter,
die <a name="ixa103638"><i>Virtuelle Maschine</i></a> (kurz: VM),
zur Ausf&uuml;hrung der erstellten Programme. 

<p>
Interpretierter Code wird naturgem&auml;&szlig; langsamer ausgef&uuml;hrt
als kompilierter, selbst wenn er in Form von Bytecodes vorliegt. Zwar
ist es prinzipiell m&ouml;glich, auch Java-Programme in Native-Code
zu &uuml;bersetzen (es gibt sogar einige kommerzielle Tools, die das
tun), aber dann ist es mit der Plattformunabh&auml;ngigkeit aus, und
das fertige Programm l&auml;uft nur noch auf einem Betriebssystem.
W&auml;hrend das f&uuml;r <i>Applikationen</i> in bestimmten F&auml;llen
akzeptabel sein mag, verbietet sich diese Vorgehensweise f&uuml;r
<i>Applets</i>, die im Internet auf vielen verschiedenen Browsern
und Betriebssystemen laufen m&uuml;ssen, von selbst. Zudem konterkarieren
native-kompilierte Programme die Grundidee der plattform&uuml;bergreifenden
Bin&auml;rkompatibilit&auml;t, die eine der herausragenden Eigenschaften
von Java ist. 

<p>
Eine Alternativl&ouml;sung bieten <a name="ixa103639"><i>Just-In-Time-Compiler</i></a>
(kurz: <a name="ixa103640"><i>JIT</i></a>), deren Entwicklung in gro&szlig;en
Schritten voranschreitet. Ein JIT ist ein Programm, das den Bytecode
von Methoden w&auml;hrend der Ausf&uuml;hrung des Programms in Maschinencode
der aktuellen Plattform &uuml;bersetzt und so beim n&auml;chsten Aufruf
wesentlich schneller ausf&uuml;hren kann. Vorteilhaft ist dabei, dass
die Klassendateien mit dem Bytecode unver&auml;ndert ausgeliefert
werden k&ouml;nnen und das Programm seinen plattform&uuml;bergreifenden
Charakter erh&auml;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&uuml;gend
M&ouml;glichkeiten, Programme zu schreiben, die <i>inh&auml;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&ouml;glicherweise einen Netto-Performancegewinn
verhindert, denn das Kompilieren des Bytecodes kostet Zeit und zus&auml;tzlichen
Speicher. 

<p>
Des weiteren ist zu bedenken, dass zur Laufzeit eine Vielzahl von
Checks durchgef&uuml;hrt werden m&uuml;ssen, die die Ablaufgeschwindigkeit
von Java-Programmen vermindert: 
<ul>
<li>Array- und String-Zugriffe werden auf Bereichs&uuml;berschreitungen
gepr&uuml;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&uuml;ft.
<li>Es gibt Checks zu vielen arithmetischen Operationen (&Uuml;berl&auml;ufe,
Teilen durch Null usw.).
</ul>

<p>
Am besten ist es daher, bereits w&auml;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&uuml;hren k&ouml;nnen.
Gleichzeitig wollen wir M&ouml;glichkeiten aufzeigen, wie man mit
alternativem Code den Engpa&szlig; umgehen und die Ablaufgeschwindigkeit
des Programms verbessern kann. Wenn man diese Regeln beachtet, ist
es durchaus m&ouml;glich, in Java gr&ouml;&szlig;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&auml;ftigen. Auch wenn sie zeitweilig kurz
angedeutet werden, k&ouml;nnen diese Themen besser in B&uuml;chern
&uuml;ber Programmiersprachen, Algorithmen oder Optimierungstechniken
f&uuml;r Compiler nachgelesen werden. Auch Tipps &amp; Tricks, die
in aller Regel nur marginale Verbesserungen bringen, oder langsamer
Code, f&uuml;r den keine einfach anzuwendenden Alternativen bekannt
sind, sollen hier nicht behandelt werden. Statt dessen wollen wir
uns auf einige gro&szlig;e Themenkomplexe konzentrieren, die leicht
umzusetzen sind und in der Praxis schnell zu Verbesserungen f&uuml;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">&nbsp;Hinweis&nbsp;</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">&nbsp;Titel&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html">&nbsp;Inhalt&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html">&nbsp;Suchen&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html">&nbsp;Index&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()">&nbsp;DOC&nbsp;</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">&nbsp;&lt;&lt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100312.html">&nbsp;&nbsp;&lt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100314.html">&nbsp;&nbsp;&gt;&nbsp;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100317.html">&nbsp;&gt;&gt;&nbsp;</a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()">&nbsp;API&nbsp;</a>
<td align="right">&copy; 1998, 2007 Guido Kr&uuml;ger &amp; Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>