C++ oder C#



  • lol



  • was lol?
    selber lol.
    schreib was du meinst, oder zitiere wenigstens das belolte.



  • Mechanics schrieb:

    ...Im Endeffekt wird C++ schon etwas schneller sein als C#, aber der Unterschied bewegt im einstelligen Prozentbereich. Und da auch nur bei sauberem C++, sonst kann man mit C++ leicht langsamere Programme schreiben.

    Nach meiner eigenen Erfahrung (und ich mag C# eigentlich), ist der Unterschied mehr als messbar wenn in dem Programm nicht ständig die gleichen Methoden aufgerufen werden.

    Es stimmt zwar das in der Theorie C# und Java schneller als C++ sein können, wenn Code sehr häufig aufgerufen wird. Doch in der Praxis gibt es viele Anwendungen bei denen die erstmalige Compilierung mehr Zeit kostet, als spätere Aufrufe retten können. Und Kunden vertröstet auch nur selten ein Spruch wie "Ab den 2ten Aufruf ist es schnell".

    Das heißt nicht das ich C# nicht empfehlen kann, aber der Grund liegt eher in den geringeren Entwicklungsaufwand begründet, als in der Performance.



  • asc schrieb:

    Es stimmt zwar das in der Theorie C# und Java schneller als C++ sein können [...]

    Ein weiterer Grund, weshalb C++ in der Praxis oft schneller ist, ist der Programmierstil in den Sprachen. C#/Java sind rein objektorientiert angelegt, während in C++ mehr auf Templates gesetzt wird. Ein Iterator in C++ ist oft ein einfacher Pointer, in C# z.B. ist es ein Objekt, bei dem für jedes Vorrücken eine virtuelle Funktion aufgerufen werden muss, was natürlich um einiges langsamer ist.



  • Praktisch alles, was C# kann, kann man auch in C++ sehr komfortabel machen. Ausnahmen sind aber z.B. Reflection Emit, was eine massive Runtime wie das .NET Framework voraussetzt (welches mit C# laut Spezifikation nicht unbedingt etwas zu tun hat). Und natürlich kommt der Komfort zu einem gewissen Preis, insbesondere weil er bei C# aufgezwungen wird. Gerade dein Beispiel mit der Speicherverwaltung ist hier schön.

    Ich benutze in allen grösseren Projekten mit C++ sehr oft Garbage Collection auf Basis von Smart Pointern und einem Mark/Sweep + Generational Algorithmus - der GC kommt überall zum Einsatz, wo es mir sinnvoll erscheint. Der GC von .NET ist noch sehr viel ausgeklügelter (der Quellcode einer alten Version 2.0 steht offen zur Verfügung), aber seine Benutzung ist zwingend. Und es ist klar, was schneller ist als die beste GC Implementierung: Kein GC. Statischer Speicher und fertig. In vielen Fällen reicht das in C++ sogar aus. Das Argument mit dem Speichermanagement pauschal zieht also nicht wirklich.

    lolelotte schrieb:

    Ein weiterer Grund, weshalb C++ in der Praxis oft schneller ist, ist der Programmierstil in den Sprachen. (...) Ein Iterator in C++ ist oft ein einfacher Pointer, in C# z.B. ist es ein Objekt, bei dem für jedes Vorrücken eine virtuelle Funktion aufgerufen werden muss (...).

    Das ist sehr richtig und nicht zu unterschätzen. Und man kombiniere nun diese Enumerator-Geschichte mit der Speicherverwaltung: Jeder Enumerator wird mit allem GC-Komfort in jeder Schleife neu auf dem GC angelegt und irgendwann wieder zerstört. Footprint: Ein Vielfaches eines Pointers, Indirektionen, virtuelle Calls, Verwaltung 😉

    PS: Ich liebe C# und in über 90% der Fälle sind diese Punkte irrelevant :p



  • /rant/ schrieb:

    Ich benutze in allen grösseren Projekten mit C++ sehr oft Garbage Collection auf Basis von Smart Pointern und einem Mark/Sweep + Generational Algorithmus - der GC kommt überall zum Einsatz, wo es mir sinnvoll erscheint.

    😮 Sowas gibts?

    Statischer Speicher und fertig.

    LOL.

    Und man kombiniere nun diese Enumerator-Geschichte mit der Speicherverwaltung: Jeder Enumerator wird mit allem GC-Komfort in jeder Schleife neu auf dem GC angelegt und irgendwann wieder zerstört.

    Ein GC zerstört nichts. Ein GC behält alles, was noch lebt, und vergisst den Rest einfach (Voraussetzung: Keine Finalizer).
    Zerstören muss man in C++.



  • Bashar schrieb:

    😮 Sowas gibts?

    Wieso sollte es sowas nicht geben?



  • Kellerautomat schrieb:

    Bashar schrieb:

    😮 Sowas gibts?

    Wieso sollte es sowas nicht geben?

    Erwartete Antworten von gut bis dämlich:

    1. Ja, siehe http://...
    2. Nein, hab mich geirrt.
    3. Wieso nicht???ßß


  • lolelotte schrieb:

    asc schrieb:

    Es stimmt zwar das in der Theorie C# und Java schneller als C++ sein können [...]

    Ein weiterer Grund, weshalb C++ in der Praxis oft schneller ist, ist der Programmierstil in den Sprachen. C#/Java sind rein objektorientiert angelegt, während in C++ mehr auf Templates gesetzt wird.

    Bitte mache nicht den Fehler dies per se auf die Objektorientierung zu schieben. Ich kann beispielsweise in C++ auch mit Ausnahme der main-Funktion rein Objektorientiert arbeiten, und dennoch muss es nichts kosten. Ausnahmen sind sicherlich virtuelle Funktionen, und die Tatsache das C#/Java jedem Objekt den GC aufzwingt. Aber letzteres hat erst einmal nichts mit dem OO-Paradigma zu tun.



  • Ich weiß nicht, wie es in C# ist, in Java ist jede Methode automatisch virtual.



  • lolelotte schrieb:

    asc schrieb:

    Es stimmt zwar das in der Theorie C# und Java schneller als C++ sein können [...]

    Ein weiterer Grund, weshalb C++ in der Praxis oft schneller ist, ist der Programmierstil in den Sprachen. C#/Java sind rein objektorientiert angelegt, während in C++ mehr auf Templates gesetzt wird. Ein Iterator in C++ ist oft ein einfacher Pointer, in C# z.B. ist es ein Objekt, bei dem für jedes Vorrücken eine virtuelle Funktion aufgerufen werden muss, was natürlich um einiges langsamer ist.

    Das sind Peanuts und darauf wollte ich nicht hinaus. Ich wollte eher im Gegenteil weg von dieser "xyz ist schneller als yzx" Geschichte, ich kanns echt nicht hören. C# ist schnell genug und die Performance ist in 99% der Fälle kein Thema. Die Unterschiede sind zu 99% und nicht spürbar und nicht messbar. Wenn es explizit um extrem zeitkritische Anwendungen geht, dann würde man eher nicht C# nehmen. Aber ansonsten ist das Gerede über Performance völlig irrelevant und reine Zeitverschwendung.
    Weiß nicht mehr wers gesagt hat, aber ich finds immer wieder gut: "The best optimizer is between your ears". Darauf wollte ich eigentlich hinaus. Dass man aus C++ theoretisch 2% mehr Performance herauskitzeln kann interessiert keinen. Unsere C++ Software in der Arbeit ist teilweise echt langsam. Da brauchen Operationen Minuten. Sind zwar komplexe Operationen, aber ganze ist über die Zeit dermaßen auseinandergewachsen, dass da Sachen zig mal berechnet und ausgeführt werden. Hat aber niemand Zeit, das umzubauen. Und das hat jetzt nichts mit der Programmiersprache zu tun. Nicht optimal aufgebaute Software, die man konzeptionell um mehrere Größenordnungen beschleunigen könnte, findet man sehr viel häufiger, als Software, wo die Programmiersprache irgendwas ausmacht.



  • Cyres schrieb:

    Ich weiß nicht, wie es in C# ist, in Java ist jede Methode automatisch virtual.

    Nein sind sie nicht.



  • Zeus schrieb:

    Cyres schrieb:

    Ich weiß nicht, wie es in C# ist, in Java ist jede Methode automatisch virtual.

    Nein sind sie nicht.

    Wikipedia schrieb:

    Programmierer der Sprachen C++, SystemVerilog oder Object Pascal müssen sich explizit mit dieser Thematik auseinandersetzen und entscheiden, welche Methoden sie als „virtuell“ definieren. In anderen objektorientierten Programmiersprachen wie Java, Smalltalk und Python sind automatisch alle Methoden virtuell.

    Stackoverflow schrieb:

    All methods in java are virtual by default.

    Soll ich nach weiteren Quellen suchen? 🙄



  • private und finale Methoden sind in Java nicht virtuell.



  • Bashar schrieb:

    private und finale Methoden sind in Java nicht virtuell.

    > "by default"
    > "automatisch"
    ( Hat er etwas frei übersetzt )



  • Bashar schrieb:

    private und finale Methoden sind in Java nicht virtuell.

    Du meinst "private Methoden sind nicht virtuell sowie finale Methoden, die keine anderen überschreiben sind nicht virtuell", oder?



  • hustbaer schrieb:

    Eine grosse Schwäche von C++ ist, dass die Standard-Library ultra-mini-klein ist (verglichen mit der von Java oder C#). Und diesen Nachteil will das C++ Standard-Kommitee schon ausräumen. Ist nur unrealistisch dass sich in absehbarer Zeit genug tut so dass C++ in dieser Hinsicht wirklich mit Java oder C# mithalten könnte.

    Mit Qt gibt es bereits eine solche Library.



  • Die Bibliothek von QT und die STL verfolgen allerdings 2 unterschiedliche Ziele 😉



  • LordJaxom schrieb:

    Bashar schrieb:

    private und finale Methoden sind in Java nicht virtuell.

    Du meinst "private Methoden sind nicht virtuell sowie finale Methoden, die keine anderen überschreiben sind nicht virtuell", oder?

    Äh, ja 🤡



  • KuhTee schrieb:

    hustbaer schrieb:

    Eine grosse Schwäche von C++ ist, dass die Standard-Library ultra-mini-klein ist (verglichen mit der von Java oder C#). Und diesen Nachteil will das C++ Standard-Kommitee schon ausräumen. Ist nur unrealistisch dass sich in absehbarer Zeit genug tut so dass C++ in dieser Hinsicht wirklich mit Java oder C# mithalten könnte.

    Mit Qt gibt es bereits eine solche Library.

    Nein.


Anmelden zum Antworten