Warum meinen eigentlich viele, dass C++ genau so schnell sei wie C?



  • CodeFinder schrieb:

    h3t schrieb:

    Wenn man bedenkt, dass heutzutage die (heim)rechner imernoch zu lahm sind um PC spiele mitels realtime raytracing darzustellen, dann sollte man auf performacne achten. udn das sehr genau.

    Das Problem ist allerdings, dass, selbst wenn Du es in C schreibst und damit Deine 5 Taktzyklen raus holst, sind die (Heim-)Rechner trotzdem zu langsam 🤡 .

    ja, aber aufgrund dieser tatsache sollte man versuchen so viel es geht aus der hardware rauszuholen. bzw man tut es und versucht es nciht nur.



  • CodeFinder schrieb:

    h3t schrieb:

    und wie sind die Implemenationsunterschiede zwischen C udn C++. Bei C++ wird man ganz anders an die Sache rangehen. Alles schön in klassen packen etc um sauberen code zu schaffen. (sauber aus der sicht eines C++ programmierers, um keinen falme z uverursachen). Dadurch wird ein overhear erzeugt.

    Stimmt, aber das kratzt keinen, wenn man die Vorteile in Bezug auf den Code sieht.

    was aber auch schnell nach hinten losgehen kann: http://www.geocities.com/tablizer/oopbad.htm
    🙂



  • Von C++ Programmieren kann man doch keine gute OOP erwarten. Die schreiben lieber was kryptisches



  • Also bitte mit C++ kannste genau gleichschnelles C schreiben!
    Nurnoch Exception handling vermeiden und es ist das selbe



  • hghfd schrieb:

    Also bitte mit C++ kannste genau gleichschnelles C schreiben!
    Nurnoch Exception handling vermeiden und es ist das selbe

    Du kannst auch C code mit C++ kompilieren 🙄 (Wenn man die unterscheide zwischen C und C++ weglässt im code).

    Es geht hier um den praktischen einsatz. In C++ wird man nunmal mehr versuchen die Sache zu abstrahieren, in etliche Klassen packen, voneinander ableiten etc etc etc. Da sammelt sich schon overhead an. Und zudem wird überall gepredigt in C++ exceptions zu verwenden statt rückgabewerte. Somit sollte man praxisbezogen denken. In C++ wird man dann wohl auf exceptions zurückgreifen und versuchen eine höhere Abstraktionsebene zu erreichen. Letzterers würde bei äußerst komplexen berechnungen nen erheblichen overhead verursachen. ich will C++ nicht verteufeln, aber das ist nun mal so.



  • h3t schrieb:

    Hmm? War eine subjektive Äußerung auf eine objektive Tatsache!
    Wenn zB pro schleifendurchlauf in C++ ein paar taktzyclen mehr gebraucht werden, udn man durchläufz dei schleife 569.354.656 mal, dann dürfte man einen ordendlichen performacneunterscheid verzeichnen.

    **
    Stichwort: Pauschalisierung**

    X.cpp

    void test()
    {
      long sum = 0;
      for (long i = 0; i < 1000000; ++i)
      {
        sum += 1;
      }
    }
    

    Y.c

    void test()
    {
      long sum = 0;
      for (long i = 0; i < 1000000; ++i)
      {
        sum += 1;
      }
    }
    

    Aha, CPP-Programm X ist also langsamer als C-Programm Y. 🙄



  • Redhead schrieb:

    h3t schrieb:

    Hmm? War eine subjektive Äußerung auf eine objektive Tatsache!
    Wenn zB pro schleifendurchlauf in C++ ein paar taktzyclen mehr gebraucht werden, udn man durchläufz dei schleife 569.354.656 mal, dann dürfte man einen ordendlichen performacneunterscheid verzeichnen.

    **
    Stichwort: Pauschalisierung**

    X.cpp

    void test()
    {
      long sum = 0;
      for (long i = 0; i < 1000000; ++i)
      {
        sum += 1;
      }
    }
    

    Y.c

    void test()
    {
      long sum = 0;
      for (long i = 0; i < 1000000; ++i)
      {
        sum += 1;
      }
    }
    

    Aha, CPP-Programm X ist also langsamer als C-Programm Y. 🙄

    🙄

    Stehst du eigtnlich auf dem Schlauch`? 🙄 Iich rede heir die ganze zeit vom PRAKTISCHEN EINSATZ und KOMPLEXEN UND AUFWÄNDIGEN BERECHUNGEN. Falls du nicht kapiert hast was ich meine, dann schau dir mal realtime raytracing an. Und wernn man C und C++ vergleciht, dann sollte man in C++ auch auf oop zurückgreifen...



  • Redhead schrieb:

    **
    Stichwort: Pauschalisierung**

    X.cpp

    void test()
    {
      long sum = 0;
      for (long i = 0; i < 1000000; ++i)
      {
        sum += 1;
      }
    }
    

    Y.c

    void test()
    {
      long sum = 0;
      for (long i = 0; i < 1000000; ++i)
      {
        sum += 1;
      }
    }
    

    Aha, CPP-Programm X ist also langsamer als C-Programm Y. 🙄

    ich sehe kein C++ programm 😉



  • h3t schrieb:

    hghfd schrieb:

    Also bitte mit C++ kannste genau gleichschnelles C schreiben!
    Nurnoch Exception handling vermeiden und es ist das selbe

    Du kannst auch C code mit C++ kompilieren 🙄 (Wenn man die unterscheide zwischen C und C++ weglässt im code).

    Es geht hier um den praktischen einsatz. In C++ wird man nunmal mehr versuchen die Sache zu abstrahieren, in etliche Klassen packen, voneinander ableiten etc etc etc. Da sammelt sich schon overhead an. Und zudem wird überall gepredigt in C++ exceptions zu verwenden statt rückgabewerte. Somit sollte man praxisbezogen denken. In C++ wird man dann wohl auf exceptions zurückgreifen und versuchen eine höhere Abstraktionsebene zu erreichen. Letzterers würde bei äußerst komplexen berechnungen nen erheblichen overhead verursachen. ich will C++ nicht verteufeln, aber das ist nun mal so.

    Wie du selber zugibst, _KANN_ C++ gleich schnell wie C sein. Die 2 wichtigsten Sprachfeatures, die in C++ mehr Performance kosten, sind Exceptions und Polymorphie. Ob C++ mehr Abstraktion(schichten) in ihre Programme einbauen als die C Programmierer sei mal dahin gestellt, ich wuerd behaupten dass bei groesseren Programmen auch C Programme so designt sind, dass Geschwindigkeit zu Gunsten von uebersichtlichem Code geopfert wird. Aber gut, stimmt schon, C++ laed eher dazu ein, das zu tun.
    Ein erfahrener Programmierer wird sich allerdings an die 80:20 Regel halten und eben die 20 wichtigen Prozent performant halten, also nur die allernotwendigsten Abstraktionen einfuehren, Optimierungen bauen und im Fall von C++ eben Exceptions und Polymorphie vermeiden (Wobei ja in letzter Zeit propagiert wird dass Exception-Handling nur dann was kostet, wenn wirklich eine Exception geworfen wird, also eh nur im Fehlerfall). In diesen 20 % wird das Programm wahrscheinlich sowieso in C und in C++ gleich ausschauen (bis auf kleinere Dinge wie "Klassen statt structs", etc.).

    Wobei, wenn wir beim Beispiel Raytracing bleiben: Ich schreib zur Zeit an einem Raytracer (in C++), und ich kann mir nicht vorstellen, dass ein

    switch (tracableobject->type)
    {
        case SPHERE:
         intersectRayWithSphere(...); break;
        case PLANE:
         intersectRayWithPlane(...); break;
    ...
    

    schneller ist als ein polymorpher Funktionsaufruf. Ob ich einen Branch oder eine Pointerderefferenzierung mach laeuft Geschwindigkeitsmaessig auf absolut das Selbe raus.

    Was Abstraktion angeht, kommt das auch auf das gleiche raus. Ob ich

    class Someclass
    {
      public:
         Someclass() {int foo = 42;}
         void doSomething() {cout << foo;}
      private:
         int foo;
    };
    

    oder ein

    struct Somestruct
    {
        int foo;
    };
    
    void initStrcut(Somestruct* s)
    {
        s->foo = 42;
    }
    
    void doSomethingToStruct(SomeStruct* s)
    {
        printf("%d", s->foo);
    }
    

    mach, ist komplett das gleiche, wissen wir eh alle. Ob C++ Programmierer einfach mehrere kleine Funktionen und Klassen schreiben, wo die C Programmierer viele grosse Funktionen und grosse Structs haben, halt ich fuer ein Geruecht (Wobei, mit Funktionsinlining kommt sowieso bei beiden der gleiche Maschinencode raus).

    Allerdings ist ein objektiver Vergleich sowieso nicht moeglich, da du dazu das gleiche Programm in C und in C++ implementieren muesstest. Allerdings wuerden verschiedene C-Programmierer verschiedene C-Programme schreiben, das gleiche fuer C++. Letztenendes wuerdest du - wenn du ausreichend Programmierer drauf ansetzt - so viel Quellcode erhalten, dass der Uebergang von "reinem strukturiertem C" zu "reinem OOP C++" fliessend waer. Es gibt genug C++ Programme, die geschrieben sind wie C-Programme, und genug C-Programme, die sogar C++ Sprachfeatures nachbauen (siehe z. B. GTK).

    Du hast noch kein einziges Beispiel gebracht, wo C++ Code langsamer ist als C Code. Und wenn du jetzt sagst "jeder Polymorphe Funktionsaufruf" muss ich sagen "in C muss man dafuer halt eine if-Verzweigung machen, ist auch nicht schneller". Wenn du sagst "Exception-Handling", werd ich dir sagen "das setzt man in performance-kritischem Code nicht ein". Sagst du "C++ Programme haben mehr Abstraktion" muss ich dir sagen, dass C Programme in der Regel gleichviel Abstraktion haben. Wir koennten hoechtens darueber streiten, dass man in C++ evtl. etwas mehr Erfahrung haben muss, um die exakt gleiche Performance zu erreichen wie in C, da es ein paar Fallstricke gibt. Aber wenn Programme von unerfahrenen Programmierern geschrieben werden, kann man sich ja wohl sowieso keine Performanz erwarten.



  • Moin.

    Schönes Schlusswort von Blue-Tiger.

    Geschlossen.


Anmelden zum Antworten