FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Java Anwendungen blitzschnell? Ein Mythos?

Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 11:34
Anonymer User
Hallo Freunde,

also ich war ja nie ein großer Fan von Java. Jedoch weiß ich langsam die gute Dokumentation zu schätzen. Also habe ich eine Frage. besteht die möglichkeit Java anwendungen so zu erstellen, dass sie zB mit C++ mithalten können(was geschwindigkeit aber auch komplexität angeht)?

im 1 semester sagte mir mal ein mensch, dass es ginge, wenn man die Java Runtime Platform wegließe….

Any ideas?

Danke

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 12:01
garou
Idee #1: Was entwickelst du bitteschön, daß du es nicht auch in egal was schreiben könntest, ohne an relevante Geschwindigkeitsgrenzen zu stoßen?
Idee #2: Wahrscheinlich gewinnst du mehr performance durch geschickte Auswahl und Implementation der von dir verwendeten Algorithmen als durch die Wahl der "richtigen" Programmiersprache.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 13:19
Loom
Wenn du optimierten Code haben willst, solltest du Assembler nehmen [24] Ansonsten schliesse ich mich garou an.

Nachtrag: Laut einem Artikel von 2004 sind C++ und Java fast gleich schnell.
Java is now nearly equal to (or faster than) C++ on low-level and numeric benchmarks. This should not be surprising: Java is a compiled language (albeit JIT compiled).

Nevertheless, the idea that "java is slow" is widely believed. Why this is so is perhaps the most interesting aspect of this article.

Ein Benchmark vom Oktober 2007 gibt auch kein genaues Ergebnis:
It’s hard to draw a conclusion because the results don’t speak just one language.[…]
Saying that C is generally several times faster than java is - according to those benchmarks - simply wrong. If you’re allowed to choose the fastest JVM the worst case for java was 30%. In other benchmarks Sun and JRockit were even able to beat ICC.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 13:53
Anonymer User
Hmm, also zumindest gefühlt war Java immer ein wenig langsamer als vergleichbarer C Code.
Für normale Anwendungen kann man allerdings getrost auf die paar Millisekunden verzichten.
Wenn man allerdings wirklich zeitkritische Anwendungen (z.B. Echtzeit 3D-Anwendungen) programmiert sollte man wohl auf C/C++ zurückgreifen - wenn man es beherrscht. Ich kenne nur 1 kommerziellen egoshooter der in Java entwickelt wurde.
Also die Wahl der Implementationssprache sollte von der Aufgabe abhängen.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 15:15
Tweety
Ich denke die reine Performance ist heute kein Auswahlkriterium mehr - da geben sich Java und C++ nicht wirklich viel (es gibt Szenarien für die eine und für die andere Sprache). Das Problem ist ja, dass i.d.R. für vergleichbare Performance-Messungen künstliche und kleine Beispiele rausgesucht werden. Diese sind (hoffentlich) jeweils hochoptimiert - nur was sagt mir das für eine praktische Aufgabe? Genau gar nix - wenn ich nicht genau in dem Bereich Numbercrunching betreibe.

Genauso wird eine kleine Anwendung auch nicht unbedingt vergleichbar sein: So wird wahrscheinlich eine Java-Anwendung die einen Haufen Frameworks benutzt (z.B. Spring, Hibernate, …) um Datenbankabstraktion, Transaktionen, Sicherheit abzubilden nicht mit einer in C++ geschriebenen Anwendung mithalten können die alles selbst umsetzt und dann vielleicht teilweise auf eben diese Faktoren verzichtet. Die Frage ist dann aber, um wie viel schneller bin ich mit einer Java-Anwendung dann fertig? Wie hoch ist die Code-Qualität? Wie gut kann ich (oder im kommerziellen Bereich noch viel wichtiger) jemand anderes das Programm erweitern oder Fehler finden? Und dank der Mehrkernprozessoren inzwischen für die Perfomance auch ein entscheidender Faktor: Wie gut skalliert das System auf mehreren Prozessoren oder lässt sich dafür anpassen?

Inzwischen würde ich die Finger von C++ lassen, wenn es nicht sehr direkt in Legacy-Systemen hängt oder es aber verdammt Hardware-nah wird. Andererseits wird dann fast immer gleich c und nicht C++ genutzt …

Genauso würde ich mit den aktuellen Betriebssystemen und JVMs kein Java nehmen, wenn es darum geht einen kleinen Konsolen-Befehl umzusetzen, weil der JVM-Start einfach recht teuer ist.

Achja: Eh ich es vergesse: Schau dir das Tooling aber auch die verfügbaren Bibliotheken für die Sprachen an: Wenn du mal mit Eclipse, Netbeans oder ähnlichem ein größeres Projekt entwickelt hast, möchtest du eigentlich nicht auf das Visual Studio von Microsoft zurückfallen um C++ zu entwickeln (Die Linux C++-IDEs entziehen sich meiner Kenntnis - Eclipse mit C++ Erweiterung hat noch recht viele Baustellen und liegt meiner Meinung nach etwas quer zum Visual Studio - einiges besser, einiges schlechter).

Achja - Komplexität: Mit Eclipse und Netbeans gibt es doch min. 2 riesige Programme die relativ "jung" sind. Und in der freien Wirtschaft stehen genug riesige in Java entwickelte Systeme, die man so aber nie zu sehen bekommt.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 15:35
Tzwoenn
Langsamer ist Java definitiv beim Starten. JVM und ein Großteil der Klassen wollen geladen und für die lokale Umgebung optimiert werden, bevor sich etwas (sichtbar) regt. Zur Laufzeit geben sich beide nicht viel. Das mit den numerischen Berechungen habe ich selbst mal überprüft… da lagen in Java und C geschriebene Programme schon vor Jahren gleichauf.

Dass Spiele häufig in C oder C++ geschrieben, liegt wie andere bei anderen Anwendungstypen auch weniger an der Leistungsfähigkeit, sondern vielmehr an der Verfügbarkeit von unterstützenden Frameworks. Ohne das Vorhandensein lowlevel APIs ala DirectX oder OpenGL oder möglicherweise sogar abstrakteren Engines wie die Unreal-, Source- oder die CryEngine wirst du heutzutage wirtschaftlich kein Land mehr sehen.

Für Java dagegen gibt es nur eine OpenGL Bridge, dafür viele Frameworks für Webentwicklung. Java kommt dort ja nicht deswegen zum Einsatz, weil sich mit C keine performanten Webanwendungen entwickeln lassen. Die Frameworkunterstützung ist in diesem Sektor einfach nur besser.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 16:16
Fred
besteht die möglichkeit Java anwendungen so zu erstellen, dass sie zB mit C++ mithalten können(was geschwindigkeit aber auch komplexität angeht)?
Was genau meinst Du eigentlich mit Komplexität? Java ist als Sprache deutlich simpler als C++. Du kannst in Java also z.B. kein Template Metaprogramming betreiben, falls das für Dich wichtig sein sollte.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 16:24
Anonymer User
vielen Dank Leute :)
Super, dass ihr euch so viel Zeit nehmt, um auf meine Frage zu antworten.

Habe in der Zwischenzeit ein wenig nachgeforscht. Für meine Zwecke scheint Java kaum jemand zu nutzen. Da ist C/C++ der klare Sieger. Der einzige Grund für mich mit Java zu arbeiten wäre zum einen die Tatsache, dass ichs ein wenig beherrsche und zum andren die gute Doku.

Naja man lernt nie aus. Ich werd mich mal an C++ versuchen, um dann später selbst sagen zu können was besser ist :)

Danke euch.
Gruß Arthur

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 16:32
Fred
Für meine Zwecke scheint Java kaum jemand zu nutzen. Da ist C/C++ der klare Sieger.
Was genau sind denn Deine Zwecke?

Außerdem möchte ich darauf hinweisen, dass es keine Sprache namens "C/C++" gibt. Möchtest Du C programmieren oder C++?

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 16:51
Fred
Hier ein Beispielprogramm, dass die unterschiedliche Natur von C und C++ berührt:
#include <algorithm> #include <iostream> #include <iterator> // Ausgeben eines int-Arrays in C // Funktioniert nicht für andere Elementtypen // Die Anzahl der Elemente muss explizit mit übergeben werden void print_array_c(const int *array, size_t size) { while (size--) printf("%d\n", *array++); } // Ausgeben eines beliebigen Arrays in C++ template<typename T, size_t size> void print_array_cplusplus(T (&array)[size]) { std::copy(array, array+size, std::ostream_iterator<T>(std::cout, "\n")); } int main() { const int primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29}; // Man beachte, dass wir die Größe des Arrays mit übergeben müssen print_array_c(primes, 10); // In der C++-Version wird diese dagegen automatisch hergeleitet print_array_cplusplus(primes); }

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 18:19
Anonymer User
Außerdem möchte ich darauf hinweisen, dass es keine Sprache namens "C/C++" gibt. Möchtest Du C programmieren oder C++?


Naja man lernt nie aus. Ich werd mich mal an C++ versuchen, um dann später selbst sagen zu können was besser ist :)

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-25 23:34
Wulf
Naja, wenn ich ein schlampig programmiertes Java-Programm mit awt-GUI mit einem terminalbasierten c-Programm vergleiche, gewinnt sicher das c-Programm bei der Performanz.

Ich hab aber auch schon die Erfahrung gemacht, dass java bei einem numerischen Problem mit c mithalten kann. Man kann schlechten Code in c produzieren und guten in Java. Aber genausogut auch umgekehrt.

Ich wage zu behaupten, dass C in Sachen Multiprocessor, Wartbarkeit, Erweiterbarkeit, Lesbarkeit, Portabilität, etc. nicht schlechter als Java abschneidet, einen fähigen Programmierer natürlich vorausgesetzt.

Das ganze ist für mich eine Geschmacksfrage.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-26 04:14
Fred
Ich wage zu behaupten, dass C in Sachen Multiprocessor […] Portabilität, etc. nicht schlechter als Java abschneidet
Ich weiß nicht genau, wie das in C aussieht, aber in C++ gibt es bisher keine Möglichkeit, portable Multiprocessor-Programme zu schreiben. Dieser Missstand wird mit dem nächsten Sprachstandard aber behoben werden.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-26 10:26
Hannes
Ich wage zu behaupten, dass C in Sachen Multiprocessor, Wartbarkeit, Erweiterbarkeit, Lesbarkeit, Portabilität, etc. nicht schlechter als Java abschneidet, einen fähigen Programmierer natürlich vorausgesetzt.

hmm, ich weiß ja nicht wie fähig man sein muss, aber in jedem c-source den ich bisher gesehen habe und der auf mehreren plattformen läuft habe ich ewig lange #ifdef WIN32-Blöcke usw. gefunden. ;-) Um sowas muss man sich bei Java einfach viel weniger kümmern.

ein weiterer faktor ist natürlich sicherheit. vor vielen fuß-schuss-fallen ist man bei java automatisch geschützt.

und natürlich kann man immer fähige programmierer voraussetzen, aber in der realität sind die fähigkeiten der menschen und die bedingungen unter denen software entsteht meistens weniger ideal.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-26 10:55
Tweety
Unter http://chaosradio.ccc.de/chaosradio_express.html finden sich diverse Interessante Podcasts - und dabei einer zu Java und einer zu C++ (wobei ich den teilweise etwas Fragwürdig fand: Die Performance von C++ und Java daran zu vergleichen wie schnell eine Zählervariable hochgezählt werden kann, und dass da C++ angeblich Faktor 4 (wenn ich das richtig im Kopf habe) schneller wäre …

Aber es fanden sich noch 2 schöne Böse Zitate in diesem Podcast:
Wenn C einem genug Seil gibt um sich aufzuhängen, dann bietet einem C++ noch das Baum-Objekt dazu.
Wenn C++ dein Hammer ist, dann sieht die ganze Welt aus wie ein Daumen.

In dem Sinne viel Spaß mit C++ (ich bin jedes mal am Fluchen, wenn ich das Zeugs anfassen muss …)

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-26 14:18
Fred
Die Performance von C++ und Java daran zu vergleichen wie schnell eine Zählervariable hochgezählt werden kann
Oh Mann. Und wenn ich die Geschwindigkeit daran messe, wie schnell ich Speicher auf dem Heap reservieren kann, ist Java 100x schneller. Und wenn es darum geht, Objekte zu löschen, ist Java unendlich mal so schnell. Toll.

RE: Java Anwendungen blitzschnell? Ein Mythos? 2009-04-26 23:49
Wulf
Ich weiß nicht genau, wie das in C aussieht, aber in C++ gibt es bisher keine Möglichkeit, portable Multiprocessor-Programme zu schreiben. Dieser Missstand wird mit dem nächsten Sprachstandard aber behoben werden.

Zum Beispiel POSIX Threads, die laufen auf recht vielen Systemen, angeblich sogar unter Windows.

hmm, ich weiß ja nicht wie fähig man sein muss, aber in jedem c-source den ich bisher gesehen habe und der auf mehreren plattformen läuft habe ich ewig lange #ifdef WIN32-Blöcke usw. gefunden. ;-) Um sowas muss man sich bei Java einfach viel weniger kümmern.
Ja, java bietet recht einheitliche Api und Datentypen, das ist schon ein großer ein Vorteil.
Würde ich in c ein Programm schreiben, das auch auf Windows laufen soll, würde ich nicht-Standard-Funktionen in eigenen Dateien kapseln, die ich dann bei Bedarf komplett austauschen kann. Damit spart man sich diese #ifdef Blöcke und muss nur die richtigen Module kompilieren.


Wie auch immer, weder Java noch C läuft auf *jedem* Rechner, aber ich vermute, dass mehr Rechner C unterstützen als Java.