Java vs C++ - Was ist dran ?

  • Hey Leute,
    man hört ja ab und zu doch wieder dass Java langsamer als C++ ist.
    Jedoch interessiert mich jetzt was da wirklich dran ist. Ist das wahr oder ist das nur einfacher Humbug den mal irgendwer in die Welt gesetzt hat ?
    MfG

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

    • Offizieller Beitrag

    Java kann durch die Virtuelle Maschine, die noch dazwischen hängt, prinzipbedingt nicht so schnell sein wie C++, das direkt Maschinencode erzeugt. Am Anfang der Java-Entwicklung war das ein großer Geschwindigkeitsunterschied, auch weil die C-Compiler schon deutlich älter und besser optimiert waren. Inzwischen ist der Unterschied nicht mehr so groß, weil Dinge wie JIT und andere die VM sehr schnell gemacht haben. Den größeren Unterschied macht jetzt also meistens wieder geschickter Code gegenüber ungeschicktem ;).

  • ich bin nicht 100% sicher, aber :
    Java ist ja kein direkter von Windows ausführbarer Code - du brauchst ja nen Interpreter, damit du Java öffen kannst.
    C++ hingegen gibt ja richtigen Bytecode her und benötigt keine Zusatzprogramme.

    m.M. ist C++ vin der Logik her schneller.
    Natürlich kommt es aber auch auf die Umsetzung des Programmierers an

  • Zitat von Cheffe

    Den größeren Unterschied macht jetzt also meistens wieder geschickter Code gegenüber ungeschicktem .

    Fullack!
    Hatte letztens wieder mal das Vergnügen, einen C#-code zu bewundern. Wie man in 50 Zeilen Code einen dermaßenen Müll reinbringen kann, ist mir ein Rätsel....jedenfalls hat der dort programmierte Grafikfilter wenigstens funktioniert. Zwar doppelt so schnell wie ein (optimierter) AutoIt-Code, aber 50x langsamer wie der von mir als C++-Noob umgesetzte Filter.

    Ein langsamer Algorithmus wird auch nicht besser, wenn man ihn in einer "schnellen" Compilersprache umsetzt!
    Ich bin davon überzeugt, dass gute Programmierer in Java schnellere Programme bauen können wie ein 08/15-Fuzzi mit C++....

  • Bestes Beispiel für Aktuelle Spiele auf Java-Basis: Minecraft, Creepsmash (CreepTD).
    Leider kann ich (direkt) nur Java mit AutoIt vergleichen, da mir in C++ kein Minecraftäquivalent einfällt.

    zu Creepsmash:
    Bei meinen TDs stoße ich grundsätzlich an die Grenzen von AutoIt, wenn man die Kollisionskontrollen bei Türmen und Gegnern schreiben muss.
    z.B. 10 Gegner und 10 Türme erfordern (ohne Tricks) 100 Kontrollen.
    In AutoIt ist bei ca. 20 Gegnern und 20 Türmen schluss mit 50 FPS.
    Bei Creepsmash gibt es seid einiger Zeit relativ große Karten (32x32 Felder), von denen ca. 800 mit Türmen belegbar sind.
    Erst wenn die Karte seeehr viele Gegner (mindestens 150 oder mehr) enthält fängt es an zu ruckeln.
    Daraus Folgt:
    AutoIt: 20*20 = 400 Kollisionen
    Java: 800*150 = 120.000 Kollisionen
    (Die Nachladezeiten nicht berücksichtigt. Es sind natürlich wesentlich weniger Kollisionen/Frame. Da das aber bei beiden wegfällt gleicht sich das in etwa wieder aus)
    Java ist also ca. 300 Mal schneller als AutoIt. (wenn man nur die Kollisionen berücksichtigt)

    Ich denke, dass C++ eine ganze Ecke schneller ist als Java (bei vergleichbarem Skill des Programmierers)
    Ich nehme nämlich gerade einen Bildfilter (der noch nicht läuft^^), der in C++ geschrieben ist auseinander.
    Dieser Filter soll es ermöglichen eine Grafik zu vergrößern und dabei zu rekonstruieren.
    Dabei werden mehrere zehntausend Pixel pro Bild verarbeitet und jeweils komplizierte Berechnungen angestellt.
    Das soll in Echtzeit ohne nennenswerte Mehrauslastung eines Spiels möglich sein. (Also < 1-2ms/Frame)
    Vermutlich ist sowas in Java nicht ohne weiteres möglich. (ich lasse mich aber gerne auch anderst belehren^^)

  • Bestes Beispiel für Aktuelle Spiele auf Java-Basis: Minecraft, Creepsmash (CreepTD).
    Leider kann ich (direkt) nur Java mit AutoIt vergleichen, da mir in C++ kein Minecraftäquivalent einfällt.

    Ich denke, dass trotzdem viele andere Spiele in C++ realisiert wurden, wegen einem (immernoch vorhandenen) Geschwindigkeitsunterschied.

    Java kann man mit C++ nicht so direkt vergleichen. Wenn man Software für Handys o.ä. schreiben will, dann bietet sich Java natürlich sehr gut an. Ich denke Java ist deshalb so praktisch, weil man es leicht für andere Betriebssysteme portieren kann. Möchte man sehr perfomante Spiele schreiben oder Grafikbearbeitungen durchführen, dann kommt man glaube ich an C++ gar nicht vorbei. Minecraft benutzt beispielsweise Engines wie OpenGl (bzw. LWJGL) und ich glaube nicht, dass die allein auf Java basieren.
    Mein Fazit wäre: Java ist leichter zu portieren, jedoch ist C++ systemnäher und kann daher schnellere Zugriffe durchführen.

    (ich lasse mich aber gerne auch anderst belehren)

    dem schließe ich mich an :D

    mfg
    Developer30

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • Ein weiterer Nachteil bei Java ist der oft enorme RAM-Bedarf, das bremst weil das Programm nicht im Cache laufen kann.
    Immerhin haben Sprachen mit korreken Datentypen den Vorteil, dass man raffinierte Sachen machen kann, die in Javascript oder AutoIt schlicht unmöglich sind.
    Beispiel:

    Zitat


    #define READ_PAD32(offset) (*((uint32*)&BlockHash_1_MemoryPAD8[(offset)&(BLOCKHASH_1_PADSIZE-1)]))


    Das stammt aus einem Hashalgorithmus, der möglichst schnell sein sollte...
    Ich hab mal zum Spass versucht, das in Javascript umzusetzen... habe aufgegeben, weil extrem umständlich.
    Auch in AutoIt wirds eklig, weil man nicht mal korrekt byteweise UND verknüpfen kann.
    Da wird mal so nebenbei ein Array von "unsigned char" nach "uint32" gecastet - für sowas ist C++ perfekt.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Byteweise Und-Verknüpfung kann AutoIt tatsächlich nicht aber wenigstens bitweise: >>BitAnd()<<....


    Der Haken liegt hier:

    Zitat


    Rückgabewert
    Gibt den Wert für das Bitweise AND der Parameter zusammen aus.
    Bit Operationen werden als 32-bit Integer ausgeführt.


    Das meine ich mit "byteweise" - geht nicht.
    Wenn mans trotzdem so hinbiegt, dass man ein Byte UND-verknüpft kriegt, dauerts ewig wegen dem Overhead.
    ... und es wird unnötig kompliziert.
    In C++ wirds wohl weniger als 1 Taktzyklus dauern.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Javascript oder Java, ohforf


    Ich habe beides erwähnt. Ist da irgendwas falsch ?
    Java - kennt Datentypen, kann viel RAM vergeuden. Ist einigermassen schnell. Kann zur Virenschleuder werden, wenn mans nicht brav updatet.
    Javascript - kennt keine Datentypen, läuft normalerweise im Browser.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Egal ob Geschwindigkeitsnachteil oder nicht - ich bezweifle, dass die Geschwindigkeit das auschlaggebende Argument für eine Entwicklung in Java ist. Da sehe ich doch eher die plattformunabhängigkeit und ein bisschen den Entwicklerkomfort (keine (umständlichen) Speicherreservierungen bei Strings o.ä.) im Vordergrund. An Geschwindigkeit kann meistens (wie bereits betont) durch geschickte Programmierung doch einiges rausgeholt werden.

  • keine (umständlichen) Speicherreservierungen bei Strings o.ä.

    in C++ gibt es die String-Klasse (string.h), mit der man ganz normal mit dynamischen Zeichenkettenarbeiten kann, wie auch sonst in Java oder AutoIt.. Ich finde es sogar etwas umständlich, jedes mal in Java einString.isEqual(str2) zu machen, weil str1==str2 in dem Fall nicht funktioniert... in C++ dagegen geht das..
    Was ich noch an C++ besser finde ist, dass man selbst Operatoren erstellen kann. Soweit ich weiß, ist das in Java nicht möglich.
    Wenn man entsprechende Libraries benutzt, kann man auch in C++ plattformunabhängig programmieren.

    den Entwicklerkomfort

    Ok, Java hat gute Packages auf Lager, mit denen sich problemlos arbeiten lässt. Auch kommen in Java keine Bufferoverflows beim unsauberen Programmieren zum Vorschein, weil der Compiler beim entwickeln sofort darauf hinweißt, wenn Objekte nicht initalisiert sind o.ä....

    Und zudem hängt es auch immer vom IDE ab. Microsoft Visual Studio kann das Debuggen in C++ beispielsweise durch gute Tools sehr vereinfachen im Gegensatz zu einfachen Editoren...
    Bei allem Respekt gegenüber Java, finde ich C++ einfach besser. Nicht nur aus Geschwindigkeitsgründen - aber es ist für mich Teil der Gründe, weshalb ich Java fast nur in Zusammenhang mit bukkit-Plugins für Minecraft benutze.

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

  • C, bzw. C++ ist wesentlich plattformunabhängiger als Java.
    Bei Java muss immer die Java Laufzeitumgebung (JRE) installiert sein, sonst geht da nichts.

    Davon mal abgesehen, dass es Millionen solcher sinnfreien Diskussionen darüber gibt, welches wohl die "beste" Programmiersprache ist, hat jede Sprache ihre Vor- und Nachteile.


    Gruß
    Greenhorn