"Runtime Overhead" durch Virtuele Maschinen (Java/.net) in Zeiten von Just in Time Compilern und modernen CPUs
-
Experte65 schrieb:
Mein Tipp:
Bei so rechen-intensiven Anwendungen wie Schach spielen Dinge wie kluges
Caching, 64-Bit-Bitboard Operationen u.ä. eine derart vordergründige Rolle,
dass Dein Java-Freund auch bei noch so exzellenter, objektorientierter
Programmierung gegen eine 'reine', nativ kompilierte C Engine (die auch
weitestgehend die selben Algorithmen implementieren müsste (um überhaupt
vergleichbar zu sein!)) keine Chance haben dürfte und idR nicht annähernd an
die üblichen Suchtiefen eines C/C++ Schachprogramms herankommen wird.
Allgemein vermute ich, dass bei so rechenintensiven Problemstellungen
wie Schach (aber-trillionen mögliche Folgestellungen schon nach wenigen
Zügen) wohl auch C++ wegen dem Overhead mit den Containern nicht gut brauchbar
ist und erheblich schlechter als C abschneiden dürfte.Der Punkt ist doch, dass der Mensch nur Dinge bis zu einer gewissen Komplexität sinnvoll verarbeiten kann. Und dann ist halt die Frage, an welcher Stelle man ein Programm komplex macht. High-Level-Sprachen ermöglichen es einem, von den Details zu abstrahieren und die Komplexität somit ins allgemeine Konzept seines Programms zu verlagern. Bei Low-Level-Sprachen hat man hingegen die Möglichkeit und auch die Notwendigkeit, sich um alle Details zu kümmern. Das heißt, dass man auf der Detailebene automatisch jede Menge Komplexität kriegt. Dann wird es aber problematischer, zusätzlich auch noch komplexe Konzepte umzusetzen.
Mit anderen Worten: Man sagt schnell "bei gleichen Algorithmen ist das C-Programm schneller". Aber in einer High-Level-Sprache hat man eben mehr Zeit, sich um den Algorithmus zu kümmern. Deswegen hat bei gleichem Aufwand tendenziell das Programm in der High-Level-Sprache den besseren Algorithmus.
-
Ich bevorzuge immer C++. Performance ist dabei aber eher ein untergeordnetes Argument.
C++ finde ich deswegen gut, da man dort auch auf einer sehr hohen Abstraktionsebene programmieren kann. In meiner Applikationslogik gibt es keine Speicherverwaltung oder irgendwelche trickreichen Optimierungen. Applikationslogik muss gut lesbar und robust sein. Beides wird von C++ optimal unterstüzt. Nebenbei kann man bei Bedarf auch Maschinennah programmieren.
Ich bin immer wieder begeistert, wie robuste und einfache APIs man in C++ formulieren kann.
Wenn es um Performance oder andere rein technische Aspekte geht, dann weiss ich, dass mit C++ alles möglich ist, was mit der Hardware möglich ist. Wenn ich eine Abstraktionsebene wie eine VM habe, ist höchstens das möglich, was abstrahiert ist. Daher gibt es mit C++ einfach keine Grenzen.
Der Nachteil ist eher, dass die Features doch so umfangreich sind, dass es sehr lange dauert, bis man es ausreichend beherrscht. Ich wünschte mir, es gäbe einfach mehr Programmierer mit professionellen C++ Kenntnissen.