Wie gross ist der Geschwindigkeitsunterschied C/C++



  • Optimizer schrieb:

    Oder wir sparen uns den Aufwand und treten dem Autor einfach so kräftig in den Arsch 😃

    Nicht gerade die optimale Lösung. 😃

    Wie wäre es, wenn man sich an die heise-Leute wendet und sie auf ihren nun mehr oder weniger offensichtlichen Fehler hinweist. Dies sollte doch im Interesse aller Beteiligten liegen, oder zumindest in unserem.



  • Sicher liegt es in unserem Intresse !
    Fuer den Autor kann ich nicht sprechen ! 😃
    Wir koennten in das heise/ct Forum ne kurze Notiz hinterlassen, falls den Autor es intressiert wie nen teil der C++ Gemeinde uber seinen Artikel denkt, das er mal auf nen Link zu diesem Forum klicken soll.

    Aber wahrscheinlich wird der Autor eh keine Zeit haben, weil er grad wieder an nem anderen Artikel schreibt, wahrscheinlich nen me Bauanleitung fuer nen kleines "Notstromaggregat" aus nem alten Reaktor eines russischen Atom-UBootes (die sind sicher grad billig zu haben, also Handelsueblich !!! ) und wie man das Teil steuert mittels einem Handheld und Windows CE ! 😃

    Ciao ...





  • Aber dann will ich auch eine Stellungnahme von den Autoren gefordert haben 😃



  • Um zur eigentlichen Frage zurückzukommen...

    Ich habe das mal in einem Embedded Projekt mit dem gcc untersucht, da hier die Rechenzeit knapp war.

    Der Hauptunterschied, der ein C++ Programm langsamer macht, sind die (abschaltbaren) Features RTTI (RunTimeTypeInformation) und die Exceptionbehandlung, da dafür zusätzlicher Code erzeugt und ausgeführt wird, auch wenn die Exception nicht auftritt.

    Das ist natürlich compilerhabhängig.



  • Exceptionbehandlung, da dafür zusätzlicher Code erzeugt und ausgeführt wird, auch wenn die Exception nicht auftritt.

    Aber nur, wenn Du in dem entsprechende C-Programm auf Fehlerbehandlung verzichtest. Für ein

    int i = doSomething();
      if (i != 0)
      {
        reportError(i);
      }
    

    wird in C nämlich auch code erzeugt.



  • Geo schrieb:

    Der Hauptunterschied, der ein C++ Programm langsamer macht, sind die (abschaltbaren) Features RTTI (RunTimeTypeInformation) und die Exceptionbehandlung, da dafür zusätzlicher Code erzeugt und ausgeführt wird, auch wenn die Exception nicht auftritt.

    Dass ein Programm durch RTTI leicht größer werden kann, verstehe ich ja. Aber wie kann dadurch die Performance beeinträchtigt werden?



  • Exceptions finde ich gar nicht teuer, hier mal nen test mit dem gcc 3.3.2 (debian prerelease)

    class bar {
      int *array;
    public:
      bar() : array(new int[100]) { }
      ~bar() { //damit der dtor nicht geinlined wird etwas sinloser code
        double c=100;
        for(;c;--c);
        delete []array;
        for(c=100;c;--c);
      }
    };
    
    struct blob { };
    struct blub { };
    
    void mop(bool c) {
      if(c)
       return; //throw blob();
    }
    
    void foo(int c) {
      bar b0,b1;
      if(c)
        return; //throw blob();
      if(c-1)
        return; //throw blub();
    }
    
    int main(int argc,char **argv) {
      //try {
        foo(argc-1);
      /*}
      catch(...) {
        return 1;
      }*/
    }
    

    kompiliert sind das (Parameter: -Wall -W -std=c++98 -Os) 5,9kb

    mit try/catch: 6,2kb

    mit foo => throw blob(); aktiviert: 6,6kb
    mit foo => throw blub(); aktiviert: 6,6kb
    mit mop => throw blob(); aktiviert: 6,6kb

    also sieht es so aus, dass man 0,8kb overhead für exceptions bezahlt (und zwar konstant im ganzen programm). Das hört sich so viel an, aber wenn man ein Projekt hat, wo die binarys über ein Megabyte gross sind, da sind 0,8kb nicht viel. Auf Embedded-Systemen lohnt es sich vielleicht auf Exceptions zu verzichten (aber Embedded-C++ kennt eh keine Exceptions AFAIK).



  • jo, Marcus hatte auf dem treffen ein Buch zum Thema "Embedded C++" mit.

    AFAIR auch keine templates (das Argument mit der Geschwindigkeit aus dem Buch war mir nicht ganz ersichtlich) und eben RTTI



  • kingruedi schrieb:

    Exceptions finde ich gar nicht teuer, hier mal nen test mit dem gcc 3.3.2 (debian prerelease)

    class bar {
      int *array;
    public:
      bar() : array(new int[100]) { }
    

    kompiliert sind das (Parameter: -Wall -W -std=c++98 -Os)

    Scherzkeks. Mit new baust Du hier bereits Exceptions in dein Programm ein. Wenn Du etwas objektiver wirken willst, dann schaltest Du Ausnahmen auf Compilerebene ab; trotzdem bezweifle ich, daß Du hier relevante Unterschiede feststellen kannst.


Anmelden zum Antworten