Die Zeiten der Schiffe aus Holz und der Männer aus Eisen brechen erneut an! Wer schon einmal sehnsüchtig in den Büchern von C.S. Forrester den Abenteuern von Kapitän Hornblower nachgespürt hat, wen die Geschichten von Patrick O'Brian über den Kapitän Aubrey aus Master and Commander in den Bann geschlagen haben oder überhaupt ein Herz für die Zeit der schönen Schiffe besitzt, der soll hier auf seine Kosten kommen.
In Entstehung ist ein plattformübergreifendes Multiplayer Webspiel
in Java, wie es schon in den BSD-Games
mit sail
angedeutet wurde, wie
es sich vielleicht die Entwickler des Spieles Wooden Ships and Iron
Men von Avalon Games (1975) erträumt hätten. Feine
Abstufungen der Segeleigenschaften einzelner Schiffe, möglichst
originalgetreue Simulation der Seetüchtigkeit und der Bewaffnung, Winddrift, Kurse zum Wind,
Schifftyp und Ausstattung, Wettereinflüsse und ihre
resultierenden, unterschiedlichen Geschwindigkeiten, Zufallsereignisse
sind geplant.
Dabei soll die Grafik bewußt einfach gehalten werden, eine Aufsicht soll reichen, mehr Wert wird gelegt auf die Simulation der Fahreigenschaften, der zum Teil komplexen Logistik auf den Schiffen sowie dem Miteinander und Gegeneinander auf dem Schlachtfeld der See und später einer Erweiterung zum Handels- oder Eroberungsspiel.
Doch erst einmal lernt das Spiel kriechen, bevor es laufen kann. Wer die Entwicklung verfolgen will, ist auf dem entsprechenden Blog eingeladen.
Während der Überprüfung von Performanceunterschieden zwischen "C" und Java fiel dieses kurze Programm an. Es sollte ursprünglich zeigen, wie viel Geschwindigkeitsverlust ein Javaprogramm gegenüber einem Programm in "C" zu verzeichnen hat. Überraschender Weise ergab sich jedoch ein Sieg für Java mit 5% Geschwindigkeitsvorteil, selbst nachdem der C-Code auf Pentium-4 Code optimiert wurde. Schleifenoptimierungen (Option -O3 u.ä.) dürfen bei GCC natürlich nicht aktiviert werden, da der C-Compiler die ansonsten leeren Schleifen einfach wegoptimiert, was nicht im Sinne des Tests ist.
Nähere Überprüfungen des absolut überraschenden Ergebnisses ergaben, dass Java meinen Pentium 4 HT Prozessor komplett ausnutzt, "C" jedoch erst einmal nur auf einem einzigen der beiden Rechenwerken läuft. Der Geschwindigkeitsvorteil des Hyperthreading quasi 2-Prozessorsystems auf einem P4HT bringt etwa 20% Geschwindigkeitsvorteil. Auf einem Einzelprozessorsystem ist Java rund 15% langsamer als reines "C". Aus der Differenz dieser beiden Werte ergab sich das überraschende Siegerergebnis für Java. Wohlgemerkt wurde der "C" Code bereits auf Pentium-4 optimiert, vorher sah es für "C" noch schlechter aus. In der Regel sind Programme nicht auf Pentium-4 optimiert.
Folgerung: je komplexer und hochwertiger das System ist, auf dem solche Berechnungen laufen, desto überlegener wird sich Java gegenüber C behaupten können. Entsprechende Folgerungen könnte man wahrscheinlich auf Clustersysteme übertragen, wozu ich allerdings weitere, ausgefeiltere Tests empfehlen würde.
Die Testumgebung war ein SuSE
Linux 9.1 mit Pentium 4 HT-System. Die im Archiv enthaltenen Binarys
sind die verschieden optimierten Versionen des Benchmarks unter Linux.
Aufruf mit ./bench
für "C", java Bench
für Java. Gezählt werden die Millisekunden.
Ein kastriertes Java mit abgeschaltetem JIT-Compiler fiel in der Leistung auf unterschiedlichen Systemen auf etwa 20-25% der Leistung der C-Version zurück, was einen Geschwindigkeitsnachteil von Faktor 4-5 bedeutet. Mit aktiviertem JIT pendelte der Wert zwischen 85-105%. Das Abschalten des JIT betraf die Integerberechnungen deutlich stärker als die Fließkommaoperationen, was ein zu erwartendes Ergebnis war.
Getestet wurde auf GCC 3.3.3 und Java 1.4.2_03 von Sun Microsystems.
Dieses niedliche, kleine Applet emuliert einen C64, allerdings mit stark eingeschränktem Betrieb. Ich fand den Emulator zwischen einem Haufen anderer Emulatoren und konnte den Autor nicht ausfindig machen. Naja. Der Java-Source lag bei und ich stellte schnell fest, dass Tastatureingaben nicht funktionierten. Nach Beseitigung einiger rudimentärer Bugs und Implementation von funktionierenden Tastatureingaben lief es dann doch überraschenderweise. Inzwischen hat sich schon wieder etwas geändert, aber diesen Fehler soll jetzt ein anderer suchen.
gcc
?
Wikipedia: Was ist die Java VM?
Artikel: Die Java Falle Warum es wichtig ist, sich von proprietärer Software zu lösen.
Wikipedia: Was ist freie Software? Warum machen sich so viele Menschen die Mühe und geben ihre Programme kostenlos ab, wo sie doch statt dessen jede Menge Geld damit verdienen könnten? Oder verdienen sie damit trotzdem Geld? Oder gerade deswegen? Oder ist Geld am Ende völlig bedeutungslos bei dieser Frage?
Buch: Java ist auch eine Insel Dieses Onlinebuch von Christian Ullenboom auf Deutsch vermittelt leicht verständlich den Umgang mit Java.
Buch: Thinking in Java von Bruce Eckel
Buch: Thinking in Patterns with Java von Bruce Eckel
Optimiert programmieren unter Java Alles zum Thema, optimieren nach Geschwindigkeit, Größe oder Wartbarkeit, ebenfalls findet sich hier der Linpack Benchmark, der ein wesentlich genaueres Ergebnis erzeugt als die hier vorgestellte Routine.
Java vs C++ Eine nicht ganz neutral geschriebene Seite, die abar am Ende auf Fakten kommt und damit sehr ernst zu nehmen ist. Wie immer gilt bei Optimierungen, dass es drauf ankommt...
Does Java need Checked Exceptions? Das Fehlerabfangen in Javaprogrammen wird häufig von Programmierern aus Bequemlichkeit ignoriert. Dafür gibt es technische und menschliche Gründe. Doch hier findet sich eine überraschend einfache Lösung für das Problem.
Tutorial: Das Java Tutorial von Sun Das Standard-Tutorial von Sun ist für die meisten Java-Anfänger und auch für die Fortgeschrittenen ein immer wieder genommenes Referenzwerk, falls es zu Problemen kommt oder Änderungen im Sprachgebrauch stattgefunden haben.
Buch: Einführung in Java Ein weiteres freies Online-Buch zum Thema Java.
Viele weitere Java Ressourcen Wem die Ressourcen bisher noch nicht genügen, findet hier mit Sicherheit alles zum Thema Java, was bislang ungenannt geblieben ist.