Warum schneidet in diesem Benchmark C schneller ab als C++?



  • sprache vs sprache endet oft in implementiertung vs implementierung und das einzige was man daraus schlussfolgern kann ist die faehigkeit des implementators.



  • rapso schrieb:

    sprache vs sprache endet oft in implementiertung vs implementierung und das einzige was man daraus schlussfolgern kann ist die faehigkeit des implementators.

    Das.

    Da man in C++ quasi genau den gleichen Code schreiben kann wie in C (mit wenigen Ausnahmen die bzgl. Performance keinen oder nur einen unwesentlichen Unterschied machen), wird C nie wirklich schnellereren Code produzieren. Oft geht es um die verwendeten Bibliotheken oder Idiome.

    Wann lernen die Leute endlich, das C++ fuer praktisch alle Zwecke monoton maechtiger ist?



  • Kann man bei dem genannten Test auch irgendwie sein eigenes Programm hochladen? Ich denke, die 5s des C++ könnte man mit ein paar Optimierungen noch verbessern.

    Interessant wäre z.B., wie teuer der operator [] von vector ist im Gegensatz zu reiner Zeigearithmetik. Das würde ich als erstes mal probieren. Ich erwarte mir keine Wunder, aber vielleicht bringt es ein bisschen was.


  • Mod

    tgttttggt schrieb:

    Kann man bei dem genannten Test auch irgendwie sein eigenes Programm hochladen? Ich denke, die 5s des C++ könnte man mit ein paar Optimierungen noch verbessern.

    Ja.

    Interessant wäre z.B., wie teuer der operator [] von vector ist im Gegensatz zu reiner Zeigearithmetik. Das würde ich als erstes mal probieren. Ich erwarte mir keine Wunder, aber vielleicht bringt es ein bisschen was.

    Das wäre schon eine ganz schön schlechte Implementierung, die operator[] nicht als return *(begin + index) implementiert.

    PS: Der GCC implementiert den Operator genau wie gesagt.
    Falls ich mal sfdfds glaube und sonst wirklich alles gleich ist, vermute ich den Unterschied eher in schlechtem Einsatz von OpenMP.



  • Also Optimierungen schön und gut, aber ich finde, ich benutze eine Sprache (z.B. C++) weil ich damit eher schöneren und somit verständlichen Code schreiben will. Deshalb benutze ich dann kein C oder Assembler.

    Wenn also Code bei diesen Benchmarks hoch geladen wird, dann will ich ehrlich gesagt keinen tot optimierten unverständlichen Code lesen. Sondern den Code wie es die Sprache vorgesehen hat.

    Das gilt auch für C-Code: wenn der Assember-Schnippsel hat, ist es kein C-Code mehr. Tut mir leid. Dann ist das Fake!


  • Mod

    Artchi schrieb:

    Also Optimierungen schön und gut, aber ich finde, ich benutze eine Sprache (z.B. C++) weil ich damit eher schöneren und somit verständlichen Code schreiben will. Deshalb benutze ich dann kein C oder Assembler.

    Wenn also Code bei diesen Benchmarks hoch geladen wird, dann will ich ehrlich gesagt keinen tot optimierten unverständlichen Code lesen. Sondern den Code wie es die Sprache vorgesehen hat.

    Das gilt auch für C-Code: wenn der Assember-Schnippsel hat, ist es kein C-Code mehr. Tut mir leid. Dann ist das Fake!

    Man kann natürlich umgekehrt sagen, dass es zeigt, wie einfach oder schwer (oder überhaupt möglich) es ist, Code in einer gewissen Sprache zu optimieren. Man sieht beispielsweise, dass die Sprachen mit guter Multithreadingunterstützung (sei es nativ oder per leicht verfügbarer Bibliothek) einen wesentlichen Vorteil haben. Ist halt die Frage, was man genau messen will. Das Ziel ist hier wohl, zu messen, was das bestmögliche Programm für diese Sprache ist, das noch jemand freiwillig zu entwickeln bereit ist. Das ist ein anders Ziel als deines.



  • Natürlich kann am Ende jeder seinen Benchmark so auslegen, wie er es haben will (unverständlicher Code, dafür maximale Geschwindigkeit). Aber wie weit darf man das treiben? Dürfte jemand eine DLL in C schreiben, und diese dann von Java aus per JNI ansprechen, um mit Java den zweiten Platz zu belegen? 😃


  • Mod

    Artchi schrieb:

    Natürlich kann am Ende jeder seinen Benchmark so auslegen, wie er es haben will (unverständlicher Code, dafür maximale Geschwindigkeit). Aber wie weit darf man das treiben? Dürfte jemand eine DLL in C schreiben, und diese dann von Java aus per JNI ansprechen, um mit Java den zweiten Platz zu belegen? 😃

    Ja. Aber der Fakt, dass es niemand macht, zeigt, dass dies unrealistisch aufwändig ist 🙂

    Wohingegen es durchaus vertretbar ist ein paar OpenMP-Direktiven in C einzubauen.



  • Arcoth schrieb:

    Wann lernen die Leute endlich, das C++ fuer praktisch alle Zwecke monoton maechtiger ist?

    Oder nehmen lieber gleich eine gut optimierende Hochsprace wie Lisp oder Haskell oder Ruby oder wenigstens JavaScript, und entwickeln top-down, und machen nur die meistens sehr wenigen Codestellen die wirklich Performancekritisch sind in C und binden sie dann per FFI ein, und freuen sich dass sie schneller fertig sind, keine Segfaults haben, und kein Kopfzerbrechen über endlose Compiler-Fehlermeldungen :3



  • Ramelucke schrieb:

    Arcoth schrieb:

    Wann lernen die Leute endlich, das C++ fuer praktisch alle Zwecke monoton maechtiger ist?

    Oder nehmen lieber gleich eine gut optimierende Hochsprace wie Lisp oder Haskell oder Ruby oder wenigstens JavaScript, und entwickeln top-down, und machen nur die meistens sehr wenigen Codestellen die wirklich Performancekritisch sind in C und binden sie dann per FFI ein, und freuen sich dass sie schneller fertig sind, keine Segfaults haben, und kein Kopfzerbrechen über endlose Compiler-Fehlermeldungen :3

    Was ist mit Julia? https://www.heise.de/newsticker/meldung/Programmiersprache-Julia-profiliert-sich-beim-High-Performance-Computing-3518621.html



  • Julia klingt so als könnte was draus werden. Aber das hat man von Rust auch geglaubt. Warten wirs ab. :3



  • Ramelucke schrieb:

    Arcoth schrieb:

    Wann lernen die Leute endlich, das C++ fuer praktisch alle Zwecke monoton maechtiger ist?

    Oder nehmen lieber gleich eine gut optimierende Hochsprace wie Lisp oder Haskell oder Ruby oder wenigstens JavaScript, und entwickeln top-down, und machen nur die meistens sehr wenigen Codestellen die wirklich Performancekritisch sind in C und binden sie dann per FFI ein, und freuen sich dass sie schneller fertig sind, keine Segfaults haben, und kein Kopfzerbrechen über endlose Compiler-Fehlermeldungen :3

    Nein, das ist eine sehr gute Idee. Ich habe ja auch von C++ vs C gesprochen, aber in tatsaechlichen Projekten koennen unkritische Stellen natuerlich funktional programmiert werden. Ich bevorzuge jedoch SML.



  • Man sieht doch auf Anhieb, dass die "C"-Variante (C-Programme sind letztendlich beide) darauf ausgelegt ist, dass sie durch den Compiler mithilfe von SSE/AVX vektorisiert wird. Das bekommt man auch in C++ hin und auch deutlich lesbarer.

    Wenn ich eine Schnecke mit einem Auto vergleiche, dann nützt es auch nichts, dass der Typ in der Tierhandlung gesagt hat, die Schnecke sei schnell für ihre Art. So lässt sich auch sonst die gesamte Benchmark-Seite zusammenfassen.


Anmelden zum Antworten