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






  • Mod

    Guck doch in den Code!



  • Das Einzige, was mir auf die Schnelle auffällt, ist, dass im C-Code kein dynamisches Array verwendet wird. In http://benchmarksgame.alioth.debian.org/u64q/program.php?test=mandelbrot&lang=gcc&id=6wi wird das aber gemacht, und der ist auch noch deutlich schneller als das C++-Programm.


  • Mod

    Dann musst du mal profilen, wo der Unterschied liegt. Da du den Source hast und sogar alle Compilereinstellungen genau angegeben sind, sollte das nicht so schwer sein.



  • Die C Variante ist grausam codiert, sowohl rein codierungstechnisch wie auch performanzmäßig laienhaft, man sollte sich eher fragen warum C nur so viel schneller als C++ oder gar Java ist.


  • Mod

    Die meisten Programme scheinen von einer kleinen Kerngruppe zu stammen. Das heißt, die Ergebnisse sind vermutlich nicht repräsentativ für das was bei bester Kenntnis aller Techniken möglich wäre, sondern dafür, was sich irgendein kleines Grüppchen vor ein paar Jahren mal ausgedacht hat.



  • Ja das trifft wohl den Kern.
    Dass sie auch noch OMP mit ins Spiel bringen, was für sprachübergreifende Vergleichszwecke immer destruktiv ist, zeugt ebenso von begrenztem Horizont.



  • 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.


Anmelden zum Antworten