C# vs Java



  • hustbaer schrieb:

    Allerdings werden die Startup-Zeiten dadurch *furchtbar*.
    OK, für Server oder lang laufende Programme ist das natürlich egal.

    Ich denke, das Problem koennte man mit einem Hybrid-Ansatz umgehen. Man kompiliert erstmal ohne Optimierungen und optimiert dann spaeter in einem seperaten Thread. Bzw, man koennte natuerlich genauso bereits einen statischen kompilierten Code zusaetzlich mitliefern und dann zur Laufzeit neu kompilieren.



  • Ja, klar, man könnte viel.
    Dein erster Vorschlag verbessert die Performance vermutlich von "furchtbar" zu "sehr sehr schlimm".
    Dein zweiter Vorschlag ist besser, aber ich kenne keine Plattform wo das umgesetzt wäre.

    Die Android Entwickler arbeiten derzeit an einer VM die ähnlich wie die CLR alles vorkompiliert und dann nur mehr die fertigen native Images lädt. Allerdings soweit ich weiss ohne "nochmal dahinter nach compilieren".

    ps: Vergiss auch nicht dass im native compilierten Code normalerweise keine Profiler Traces mehr erfasst werden. D.h. ich bin gar nicht so sicher wie viel schneller das mit der nötigen Instrumentation laufen würde, nur weil es native compiliert ist.

    ps2: "Man könnte ja" Argumente bei einer Sprache die seit fast 20 Jahren existiert sind auch immer lustig. Wieso hat man nicht schon lange wenn man könnte?


  • Mod

    hustbaer schrieb:

    Ich schätze die grösseren Bremsen bei Java sind eher "keine value types", das Memory-Model, der GC, "alles virtual" und "alles safe" (Bounds-Checks, nur checked Casts etc.). Und vielleicht dass das Ding als Stack-Machine statt als Unlimited-Register-Machine ausgelegt ist.

    +1. Das war es, was ich mit "designbedingt" langsam meinte.

    Kellerautomat schrieb:

    Das ist uebrigens ein guter Punkt. Ich koennte mir durchaus vorstellen, dass eine C++ VM statisch kompiliertes C++ outperformen kann durch Optimierungen zur Laufzeit. Das collapsen von Laufzeit-Konstanten koennte beispielsweise sehr interessant sein.

    Stimme nicht zu. Denn das ist schon ziemlich genau das, was sowieso schon passiert. Zumindest bei mir ist eine profile-guided Optimierung meistens der Ansatz, der am meisten bringt. Ist zwar bei den meisten Compilern recht aufwändig durchzuführen (daher mache ich es nur bei Programmen, bei denen es sich wirklich lohnt), aber wenn man es einmal hat, dann hat man's.
    Letztlich bringt das aber auch nur wenige Prozente gegenüber "normaler" Optimierung, sofern man es nicht mit Absicht drauf anlegt ein Programm zu schreiben, dass die Vorteile dieser Technik demonstriert.



  • Hat jemand von euch schon mal die Unterschiede gebenchmarkt? Bei realistischen, großen Applikationen mit komplexen Datenstrukturen und nicht gerade komplett auf Durchsatz ausgelegter primitiver Datenverarbeitung?

    Meines Wissens nach wird der Unterschied sehr schnell vernachlässigbar.
    Habe auch das Gefühl dass Hotspot hier unterschätzt wird. Nur weil die Sprache prinzipiell vorsieht alle Arrayzugriffe zu prüfen bedeutet das nicht dass diese Prüfungen nicht wegoptimiert werden wenn der Compiler die Richtigkeit beweisen kann - und das kann er oft.

    Für Java spricht weiterhin die super Toolunterstütztung sowie die ganzen Bibliotheken und Frameworks.

    Soll auf keinen Fall hier eine Java vs. C++ Diskussion werden.
    C++ hat durchaus eine Sparte in der es glänzt. Aber garantiert nicht überall.

    Und Java ist (mittlerweile) eine tolle Sache. JavaFX ist super. Mit der Streaming-API und Lambdas lässt es sich richtig schön arbeiten.


  • Mod

    Ethon schrieb:

    Hat jemand von euch schon mal die Unterschiede gebenchmarkt? Bei realistischen, großen Applikationen mit komplexen Datenstrukturen und nicht gerade komplett auf Durchsatz ausgelegter primitiver Datenverarbeitung?

    Der Trick bei solchen Messungen ist halt, dass man sich top auskennen muss mit allen Tricks in allen getesteten Sprachen. Das können nur die wenigsten Einzelpersonen, daher kann das kaum jemand persönlich messen. Also braucht man das Wissen vieler Experten. Es gibt im Netz irgendwo eine Seite, wo jeder Nutzer Programme in einer ihm bekannten Sprache für Benchmarks hinterlegen kann (für vorgegebene Probleme). Die besten C und C++ Programme waren, wenn ich mich recht erinnere, immer so Faktor 2-3 vor Java. Leider finde ich die Seite gerade nicht wieder.
    Einen ganz ähnlichen Test, nicht mit dem Schwarmwissen, sondern mit dem Wissen seiner vielen Entwickler, hat vor einer Weile Google durchgeführt:
    https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf
    Erst Vergleich dogmatischer Programme, bei denen Java wieder so um Faktor 4 langsamer ist als C++. Nachdem der Javaexperte das Programm optimiert hatte, war es so schnell wie die C++-Version. Aber nachdem die C++-Experten das C++ Programm optimiert hatten, war dieses aber auch wieder um einen Faktor 3-5 schneller als die ursprüngliche C++-Version. Irgendwie scheint 2-4 so der Faktor zu sein, der bei allen Vergleichen am Ende stehen bleibt.



  • Ethon schrieb:

    Hat jemand von euch schon mal die Unterschiede gebenchmarkt? Bei realistischen, großen Applikationen mit komplexen Datenstrukturen und nicht gerade komplett auf Durchsatz ausgelegter primitiver Datenverarbeitung?

    Ich habe eher den gegenteiligen Eindruck. Bei komplexen Verarbeitungen wird viel Speicher freigegeben und deswegen laeuft oft der Garbagecollector durch, waehrend einfache Sachen komplett ohne auskommen. Ausserdem machen sich nach meiner Einschaetzung die Nachteile durch Type-Erasure und die ganzen virtual-calls, type-casts und geringe Cache-locality so richtig bemerkbar. Natuerlich nur, wenn man C++ nicht selber im Java-Style programmiert.

    Ethon schrieb:

    Soll auf keinen Fall hier eine Java vs. C++ Diskussion werden.
    C++ hat durchaus eine Sparte in der es glänzt. Aber garantiert nicht überall.

    Ich sehe das eher anders herum. Java wurde als Programmiersprache fuer fast alle Anwendungsfelder designed oder zumindest von vielen als das angesehen. Aber das ist Java nicht.
    C und C++ hingegen sind als hardwarenahe, schnelle Sprachen entwickelt worden und haben als Einsatzzwecke Betriebssystemskomponenten und performancehungrige Anwendungen. Wer kleine GUI-Anwendungen in C++ schreibt ist selbst Schuld ueber die verlorene Zeit und plattformabhaengigkeit.



  • Marthog schrieb:

    Ich sehe das eher anders herum. Java wurde als Programmiersprache fuer fast alle Anwendungsfelder designed oder zumindest von vielen als das angesehen. Aber das ist Java nicht.

    Sorry.
    google "OAK language"! Und folge ein paar Links. Java ist für Waschmaschinen und Toaster designed worden und passt da perfekt. Genau da sind die Vorteile:
    - dümmstmögliche Programmierer einstellbar (GC etc…)
    - VM (Prozessorhersteller liefert die VM, Waschmaschinenhersteller baut neuen billigeren besseren Prozessor ein ohne eine Sekunde Anpassung)
    google noch ein wenig mehr.



  • @Ethon
    Ich will Java auch nicht seine Daseinsberechtigung absprechen.
    Schon alleine auf Grund der mächtigen Libraries und Tools ist Java für viele Anwendungsbereiche eine Tolle Sachen (tm).

    Wenn's aber um rohe Performance geht, dann hat C++ momentan noch in vielen Bereichen die Nase vorne.



  • SeppJ schrieb:

    Einen ganz ähnlichen Test, nicht mit dem Schwarmwissen, sondern mit dem Wissen seiner vielen Entwickler, hat vor einer Weile Google durchgeführt:
    https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf
    Erst Vergleich dogmatischer Programme, bei denen Java wieder so um Faktor 4 langsamer ist als C++. Nachdem der Javaexperte das Programm optimiert hatte, war es so schnell wie die C++-Version. Aber nachdem die C++-Experten das C++ Programm optimiert hatten, war dieses aber auch wieder um einen Faktor 3-5 schneller als die ursprüngliche C++-Version.

    Und das war bei einem Programm, dass so einfach war, das ein Mann es einfach mal vier mal schneller machen kann. Das zeigt doch eigentlich nur, dass der Entwickler einen viel größeren Einfluss auf die Performance hat, als die Sprache. Und die meisten Java-Entwickler verwenden Java, weil es einfacher als C++ war, als sie eine Sprache lernen mussen, was wieder einen Rückschluss auf die Qualität der Entwickler zulässt. Außerdem habe ich den Eindruck, dass fast alle größeren Java-Programme ein Haufen zusammengeklebter Frameworks ist, der mit etwas spezial Logik versehen wird und fast kein Java-Entwickler im Detail weiß, was sein Maven-Apache-Database-Hibernate-EJB-Spring generiertes Programm so macht, weder auf Laufzeitkomplexitätsebene und noch viel weniger auf der Ebene was die Ausführungsgeschwindigkeit von bestimmtem Code angeht.



  • gefunden schrieb:

    Außerdem habe ich den Eindruck, dass fast alle größeren Java-Programme ein Haufen zusammengeklebter Frameworks ist, der mit etwas spezial Logik versehen wird und fast kein Java-Entwickler im Detail weiß, was sein Maven-Apache-Database-Hibernate-EJB-Spring generiertes Programm so macht, weder auf Laufzeitkomplexitätsebene und noch viel weniger auf der Ebene was die Ausführungsgeschwindigkeit von bestimmtem Code angeht.

    Das ist ja in dem Fall eben auch völlig egal. Bei den Anwendungen, die ich in Java geschrieben hatte, war das völlig egal und Java war auch schnell genug. Hätt keinen interessiert, wenn die Programme etwas schneller gelaufen wären. Und das da viele Frameworks "zusammengeklebt" werden ist schon richtig, aber das ist auch völlig ok. Das entspricht den Anforderungen. Würdest du es besser finden, das alles komplett von Hand in C++ zu schreiben? Das macht die Anforderungen an sich nicht komplexer oder interessanter. Nur kann man sich in Java dann bei bestimmten Anforderungen halt auf die Logik konzentrieben und viel langweiliger Boilerplate drum herum wird von den Frameworks abgenommen. Das passt halt ganz gut bei den eher langweiligen Enterprise Anwendungen, für die Java oft verwendet wird. Die würd ich in C++ auch nicht wirklich schreiben wollen, zumindest nicht from scratch.


Anmelden zum Antworten