Java vs. C++



  • Vielleicht sollten sich die Gemüter zu dem Thema etwas entspannen und einen Film ansehen 🙂 https://www.youtube.com/watch?v=RnqAXuLZlaE



  • C++ ist langsamer als C, wenn man Objektorientierung benutzt (Konstruktoren, Destruktoren, mehr Daten...). Ansonsten ist das doch C, welches mit einem C++-Compiler compiliert wurde.



  • Eines der größten Probleme wird wohl bleiben, dass die meisten Leute überhaupt nicht in der Lage sind entscheiden zu können, welche Sprache die Richtige für ihr Problem ist.

    MMn. trifft es dieser Spruch am besten:
    "C++ ist eine der meist genutzten Sprache, obwohl diese so scheiße schwer und kompliziert ist."
    Java hingegen ist nur einfach.



  • Gibt es irgendwo *gute* Benchmarks für Java vs. C++, also bei denen das Programm in der jeweiligen Sprache immer bestmöglichst die Sprachfeatures ausnutzt (nicht so wie der olle c't-Test, wo Strings in C++ per value (!) übergeben wurden)?



  • grundsätzlich gilt, dass die javavm einen interpreter darstellt und dass dieser interpreter naturgemäß einfach mehr rechenzeit beansprucht, als opcodes.

    da brauchst du keine benchmarks für.



  • HansKlaus schrieb:

    grundsätzlich gilt, dass die javavm einen interpreter darstellt und dass dieser interpreter naturgemäß einfach mehr rechenzeit beansprucht, als opcodes.

    Die JVM hat auch einen JIT Compiler aus dem Opcodes rauspurzeln. Die Begründung passt also nicht.



  • Kritischer Geist schrieb:

    Gibt es irgendwo *gute* Benchmarks für Java vs. C++, also bei denen das Programm in der jeweiligen Sprache immer bestmöglichst die Sprachfeatures ausnutzt (nicht so wie der olle c't-Test, wo Strings in C++ per value (!) übergeben wurden)?

    *push*



  • Tobiking2 schrieb:

    HansKlaus schrieb:

    grundsätzlich gilt, dass die javavm einen interpreter darstellt und dass dieser interpreter naturgemäß einfach mehr rechenzeit beansprucht, als opcodes.

    Die JVM hat auch einen JIT Compiler aus dem Opcodes rauspurzeln. Die Begründung passt also nicht.

    class jvm
    {
    stack<call_frame> callStack;
    stream<byte_code> byteCode;
    mapped_file<native_code> nativeCode;
    map<byte_code*, native_code*> codeCache;
    }
    

    Ach wieso nicht? Nur weil Opcodes generiert wird?



  • Kritischer Geist schrieb:

    Kritischer Geist schrieb:

    Gibt es irgendwo *gute* Benchmarks für Java vs. C++, also bei denen das Programm in der jeweiligen Sprache immer bestmöglichst die Sprachfeatures ausnutzt (nicht so wie der olle c't-Test, wo Strings in C++ per value (!) übergeben wurden)?

    *push*

    https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=java&lang2=gpp



  • benchm schrieb:

    Kritischer Geist schrieb:

    Kritischer Geist schrieb:

    Gibt es irgendwo *gute* Benchmarks für Java vs. C++, also bei denen das Programm in der jeweiligen Sprache immer bestmöglichst die Sprachfeatures ausnutzt (nicht so wie der olle c't-Test, wo Strings in C++ per value (!) übergeben wurden)?

    *push*

    https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=java&lang2=gpp

    Danke! Da schneidet ja C++ immer deutlich besser als Java ab. 🙂


  • Mod

    Kritischer Geist schrieb:

    benchm schrieb:

    Kritischer Geist schrieb:

    Kritischer Geist schrieb:

    Gibt es irgendwo *gute* Benchmarks für Java vs. C++, also bei denen das Programm in der jeweiligen Sprache immer bestmöglichst die Sprachfeatures ausnutzt (nicht so wie der olle c't-Test, wo Strings in C++ per value (!) übergeben wurden)?

    *push*

    https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=java&lang2=gpp

    Danke! Da schneidet ja C++ immer deutlich besser als Java ab. 🙂

    Es ist durchaus bekannt, dass C++ Programme etwas schneller als Javaprogramme laufen. Man nutzt Java aber auch nicht, wenn es einem darum geht, das performanteste Programm zu schreiben. Java nutzt man aus anderen Gründen, zum Beispiel könnte die Infrastruktur im Umfeld der Sprache relevant sein und das verfügbare Know-How diesbezüglich. In Sachen Performance reicht es für Java völlig aus, halbwegs in der gleichen Liga wie C++ zu spielen. Wenn Javaprogramme grundsätzlich >10 mal langsamer als C++ Programme wären, dann wäre das für Java wohl ein Problem. So ist es aber nicht.



  • Kritischer Geist schrieb:

    Danke! Da schneidet ja C++ immer deutlich besser als Java ab. 🙂

    das ist jetzt nichts besonderes und eigentlich habe ich dir das ja auch so gesagt. prinzipiell schneidet C sogar noch ein bisschen besser ab, aber jeder, der mal eine grafische oberfläche mit der winapi erstellt hat, weiß diese vereinfachungen, wie java sie mit sich bringt, zu schätzen.



  • prinzipiell schneidet C sogar noch ein bisschen besser

    Das stimmt so leider gar nicht - wird aber gerne immer und immer und immer wieder angeführt

    C++ erlaubt viel besseres inlining (z.B. mit templates) - selbst mit C Macros kommt man nicht auf das Niveau
    und auch der schlimme Code-Bloat von denen viele erzählen ist Seemannsgarn das gerne und vielfach von unerfahrenen Entwicklern einfach weiter gesponnen wird



  • Naja es gibt schon Dinge, für die c besser geeignet ist, als c++,einfach weil c schneller ist.
    Also ein c-programm ist natürlich ein c++-programm, wenn auch kein gutes, aber warum den c++-compiler mit c-code füttern, statt gleich den richtigen compiler zu nehmen?



  • HansKlaus schrieb:

    Naja es gibt schon Dinge, für die c besser geeignet ist, als c++,einfach weil c schneller ist.

    Nope. Du kannst in C++ oft wesentlich schneller sein als in C, langsamer zu sein geht aber nur mit schlechtem Code...



  • für die c besser geeignet ist, als c++,einfach weil c schneller ist.

    das ist aber eben definitiv falsch - C ist in keinem Fall schneller als C++ - an was denkst du denn bei solchen Aussagen? die Inline-Fähigkeit von C++ kann man in C nicht oder nur mit sehr viel Aufwand erreichen - du verbreitest schon wieder Geschwindigkeits-Mythen im Internet (das 1. mal hier https://www.c-plusplus.net/forum/p2507658)



  • Gast3 schrieb:

    an was denkst du denn bei solchen Aussagen?

    hmmm ablaufsteuerungen z.b.?



  • Ablaufsteuerungen? Was soll den der Käse?

    Im Gegensatz zu C kennt C++ so einige Sprachelemente, die sich zur Kompilierzeit auflösen lassen und womit enorm viel Laufzeit gespart werden kann. Templates, constexpr... machts möglich.

    So ist der C++ STL Quicksort sehr viel schneller als der der C Standard Bibliothek. Beides generische Varianten. Der Unterschied ist, dass der C++ Kompiler den Vergleich zweier Elemente einfach inlinen kann und sich pro Vergleich einen Funktionsaufruf spart.

    http://www.geeksforgeeks.org/c-qsort-vs-c-sort/

    STL’s sort ran faster than C’s qsort, because C++’s templates generate optimized code for a particular data type and a particular comparison function.

    STL’s sort runs 20% to 50% faster than the hand-coded quicksort and 250% to 1000% faster than the C qsort library function.

    Ein anderes Beispiel ist das Durchsuchen von Lookup Tabellen oder Berechnungen die zur Kompilierzeit ausgeführt werden können, wenn die Eingangsdaten zur Kompilierzeit bekannt sind.

    constexpr int factorial(int n)
    {
        return n <= 1? 1 : (n * factorial(n - 1));
    }
    

    Das hier rechnet dir der Kompiler zur Kompilierzeit aus, wenn n bekannt ist. Oder eben zur Laufzeit, wenn nicht. Kein extra code.

    Und das hier ist nur die Spitze des Eisbergs. C++ ist wesentlich mächtiger als C und trotzdem genauso performant.



  • QSort schrieb:

    http://www.geeksforgeeks.org/c-qsort-vs-c-sort/

    STL’s sort ran faster than C’s qsort, because C++’s templates generate optimized code for a particular data type and a particular comparison function.

    STL’s sort runs 20% to 50% faster than the hand-coded quicksort and 250% to 1000% faster than the C qsort library function.

    Irgendwelche ein Idiot in Internet postet Sache die mir gefallen.

    Theoretisch gibst es kein Unterschied zu Optimierung von einfachen C-Funktionen oder C++ Template Funktion.

    Praktisch liegt es an dem Implementierung(Compiler) und/oder am der Person, die die Implementierung benutzt.

    Code aus URL (angepasst):
    - include eingefügt
    - N 100000

    Visual Studio 2015
    Einstellung Standard

    C:\Users\zeus\Desktop\Project1\Debug>Project1.exe
    Time taken by C qsort() - 0.052
    Time taken by C++ sort() - 0.175
    
    C:\Users\zeus\Desktop\Project1\Release>Project1.exe
    Time taken by C qsort() - 0.015
    Time taken by C++ sort() - 0.006
    

    Ops C war einmal schneller 😮 🤡



  • Naja, im Debug-Mode zu vergleichen ist ja auch völliger Käse - ist als ob du 2 Autos vergleichst, welche mit angezogener Handbremse fahren 😉


Anmelden zum Antworten