Wieviel klassen haben große Projekte?



  • So! jetzt bin ich vorerst wieder nicht mehr überzeugt. Code :

    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    class TestClass
    {
       private :
    
       int a;
       int b;
       public :
    
       TestClass()
       :a(5),b(0)
       {
       }
    
       void doSomething ()
       {
          b+=a;
       }
       int getResult () const
       {
          return b;
       }
    };
    
    int doSomething ()
    {
       return 5;
    }
    
    int main(int argc, char *argv[])
    {
      const int end = 50000;
      int b=0;
      int i,j;
      int a = 5;
      time_t time;
      TestClass testClass = TestClass();
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            testClass.doSomething();
         }
      }
      b=testClass.getResult();
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      b=0;
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            b+=doSomething();
         }
      }
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      b=0;
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            b+=a;
         }
      }
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      system("PAUSE");   
      return 0;
    }
    

    Mit dem Objekt dauert es bei mir fast 10 mal so lange.

    [ Dieser Beitrag wurde am 29.11.2002 um 00:23 Uhr von Gregor editiert. ]



  • feigling 😡
    was stand da gerade? *wissen will*



  • Original erstellt von <...>:
    feigling 😡
    was stand da gerade? *wissen will*

    Jetzt steht was ähnliches da. Vorhin hatte ich nen kleinen Fehler drin, bzw. es hat an was anderem gelegen. ...jetzt wahrscheinlich auch : Durch das Objekt kann eine bestimmte Sache nicht mehr optimiert werden. ...ihr kommt schon drauf, was es ist. 🙂



  • Ich denke mal OOP ansich ist keine Bremse, aber man ist als OOP-Programmierer glaub ich ein bisschen großzügiger und baut in seine Klasse noch ein bisschen Extrazeugs rein, so dass das Programm geringfügig (eigentlich nicht merkbar) langsamer wird. 😕 😕 😕



  • Original erstellt von <OOPler>:
    Ich denke mal OOP ansich ist keine Bremse, aber man ist als OOP-Programmierer glaub ich ein bisschen großzügiger und baut in seine Klasse noch ein bisschen Extrazeugs rein, so dass das Programm geringfügig (eigentlich nicht merkbar) langsamer wird. 😕 😕 😕

    Du merkst nen Faktor 10 bei der Geschwindigkeit nicht?! 😮 🙂
    Sicher : Das ist ein extremes Beispiel. Aber wenn man Pech hat, dann baut man sich sowas in irgendeiner Form in einen Programmteil ein, der schnell sein muss.



  • LOL, Gregor, ich hab deinen Code weder ausprobiert noch angeschaut. Wie kannst du mir sowas unterstellen? :p



  • Original erstellt von <OOPler>:
    LOL, Gregor, ich hab deinen Code weder ausprobiert noch angeschaut. Wie kannst du mir sowas unterstellen? :p

    Erst soll ich Code schreiben und dann liest ihn keiner und sagt mir, wo ich die fiese Bremse eingebaut habe! 😞 ...Naja! Wenigstens weiß ich, was bremst! Aber ich sag es euch mal nicht! :p



  • teste mal hier mit

    class TestClass
    {
       private :
       int b;
       public :
    
       TestClass()
       :b(0)
       {
       }
    
       void doSomething ()
       {
          b += 5;
       }
       int getResult () const
       {
          return b;
       }
    };
    

    außerdem

    int main(int argc, char *argv[])
    {
      const int end = 50000;
      int b=0;
      int i,j;
      int a = 5;
      time_t time;
      TestClass testClass = TestClass();
      time = clock();
    

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Init#Answ
    und vermeide Standard Ctor aufrufe

    und noch was, wie komms du nur! die Ausgabe mit zu messen?

    [ Dieser Beitrag wurde am 29.11.2002 um 01:13 Uhr von Dimah editiert. ]



  • Da kommt schon gleich jemand der sich das ganze mal anschaut. Nur Geduld. 😃 Ich hab heute einfach keine Lust zu raten :p



  • Original erstellt von Dimah:
    **und noch was, wie komms du nur! die Ausgabe mit zu messen?

    **

    ups, sorry verkuckt



  • mach mal auß

    b=testClass.getResult();
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
    

    ein

    std::cout << clock() - time << "ms" << std::endl;
      std::cout << testClass.getResult() << std::endl;
    

    nicht das es viel speed bringen würde, aber sind sie gleicher

    [ Dieser Beitrag wurde am 29.11.2002 um 01:19 Uhr von Dimah editiert. ]



  • OK! Du hast das a entdeckt! ...viel zu schnell! 😞 🙂

    ...aber hier sieht es genau gleich aus und da kann man das a nicht so leicht löschen :

    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    class TestClass
    {
       private :
    
       int a;
       int b;
       public :
    
       TestClass()
       :a(1),b(0)
       {
       }
    
       void doSomething ()
       {
          a <<= 1;
          a += 1;
          b+=a;
       }
       int getResult () const
       {
          return b;
       }
    };
    
    int main(int argc, char *argv[])
    {
      const int end = 35000;
      int b=0;
      int i,j;
      int a = 1;
      time_t time;
      TestClass testClass;
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            testClass.doSomething();
         }
      }
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << testClass.getResult() << std::endl;
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            a <<= 1;
            a += 1;
            b+=a;
         }
      }
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      system("PAUSE");   
      return 0;
    }
    

    Naja! Faktor 3 noch!

    [ Dieser Beitrag wurde am 29.11.2002 um 01:29 Uhr von Gregor editiert. ]



  • Naja! Faktor 3 noch!
    [/QB]

    mit msvc 6.0 autorenedition (sie optimiert nicht) kann ich das ergebnis nicht nach vollziehen



  • Original erstellt von Dimah:
    **
    mit msvc 6.0 autorenedition (sie optimiert nicht) kann ich das ergebnis nicht nach vollziehen**

    Ich habe g++ (aus MinGW) mit der höchsten Optimierungsstufe genutzt.

    [ Dieser Beitrag wurde am 29.11.2002 um 01:45 Uhr von Gregor editiert. ]



  • sie? 😕 😕 😕



  • Original erstellt von <LOL>:
    sie? 😕 😕 😕

    die autorenedition

    Original erstellt von Gregor:
    [quote]Original erstellt von Dimah:
    [qb]
    mit msvc 6.0 autorenedition (sie optimiert nicht) kann ich das ergebnis nicht nach vollziehen

    Ich habe g++ (aus MinGW) mit der höchsten Optimierungsstufe genutzt.
    [/QB][/QUOTE]
    wie schlate ich sie ein



  • g++ -o Programm.exe Programm.cpp -O3

    EDIT : Genauer gesagt hat meine IDE folgendes gemacht :

    g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include/c++" -s -O3
    g++.exe main.o -o "TestOOPSpeed.exe" -L"C:/Dev-Cpp/lib" -L"C:/qt/lib" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include" -I"C:/Dev-Cpp/include/c++" -s -O3

    [ Dieser Beitrag wurde am 29.11.2002 um 02:00 Uhr von Gregor editiert. ]



  • dann müsste es aber "es" heissen. 🕶



  • Original erstellt von Gregor:
    Naja! Faktor 3 noch!

    ok, ich mess den selben code mal...
    6649ms
    -1225000004
    10305ms
    -1225000004
    Klasse ist schneller!

    jetzt mach ich ein paar variablen lokaler und ändere sonst nix:

    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    #define for if(false);else for//msvc bugfix
    
    class TestClass
    {
       private :
    
       int a;
       int b;
       public :
    
       TestClass()
       :a(1),b(0)
       {
       }
    
       void doSomething ()
       {
          a <<= 1;
          a += 1;
          b+=a;
       }
       int getResult () const
       {
          return b;
       }
    };
    
    int main(int argc, char *argv[])
    {
        const int end = 35000;
        {
            time_t time = clock();
            TestClass testClass;
            for (int i = 0 ; i < end ; ++i)
            {
                for (int j = 0 ; j < end ; ++j)
                {
                    testClass.doSomething();
                }
            }
            std::cout << clock() - time << "ms" << std::endl;
            std::cout << testClass.getResult() << std::endl;
        }
        {
            time_t time = clock();
            int b=0;
            int a = 1;
            for (int i = 0 ; i < end ; ++i)
            {
                for (int j = 0 ; j < end ; ++j)
                {
                    a <<= 1;
                    a += 1;
                    b+=a;
                }
            }
            std::cout << clock() - time << "ms" << std::endl;
            std::cout << b << std::endl;
        }
        system("PAUSE");   
        return 0;
    }
    

    10074ms
    -1225000004
    6680ms
    -1225000004
    Klasse ist lahmer.
    oha!

    ich dreh die messung mal um:

    int main(int argc, char *argv[])
    {
        const int end = 35000;
        {
            time_t time = clock();
            int b=0;
            int a = 1;
            for (int i = 0 ; i < end ; ++i)
            {
                for (int j = 0 ; j < end ; ++j)
                {
                    a <<= 1;
                    a += 1;
                    b+=a;
                }
            }
            std::cout << clock() - time << "ms" << std::endl;
            std::cout << b << std::endl;
        }
        {
            time_t time = clock();
            TestClass testClass;
            for (int i = 0 ; i < end ; ++i)
            {
                for (int j = 0 ; j < end ; ++j)
                {
                    testClass.doSomething();
                }
            }
            std::cout << clock() - time << "ms" << std::endl;
            std::cout << testClass.getResult() << std::endl;
        }
        system("PAUSE");   
        return 0;
    }
    

    9974ms
    -1225000004
    9904ms
    -1225000004
    gleich schnell.

    rätsel über rätsel.



  • uih, jetzt kommts ganz fett:
    erstmal den code nehmen, der noch das a mal drinhat und mal nicht:

    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    
    class TestClass
    {
       private :
    
       int a;
       int b;
       public :
    
       TestClass()
       :a(5),b(0)
       {
       }
    
       void doSomething ()
       {
          b+=a;
       }
       int getResult () const
       {
          return b;
       }
    };
    
    int doSomething ()
    {
       return 5;
    }
    
    int main(int argc, char *argv[])
    {
      const int end = 50000;
      int b=0;
      int i,j;
      int a = 5;
      time_t time;
      TestClass testClass = TestClass();
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            testClass.doSomething();
         }
      }
      b=testClass.getResult();
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      b=0;
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            b+=doSomething();
         }
      }
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      b=0;
      time = clock();
      for (i = 0 ; i < end ; ++i)
      {
         for (j = 0 ; j < end ; ++j)
         {
            b+=a;
         }
      }
      std::cout << clock() - time << "ms" << std::endl;
      std::cout << b << std::endl;
      system("PAUSE");   
      return 0;
    }
    

    messen:

    13489ms
    -384901888
    0ms
    -384901888
    0ms
    -384901888

    oha! die klassen-variante ist ERHEBLICH langsamer.

    und jetzt eine klitzekleine änderung in der Klasse.
    ich mache aus

    int a;
       int b;
    

    lieber

    int b;
       int a;
    

    mit dem Wunsch: Das erste Attribut ist das schnellste, und auf b soll er rechnen, a wird er schon wegoptimieren können...

    messen...
    0ms
    -384901888
    0ms
    -384901888
    0ms
    -384901888

    jo, der Trick hat ordentlich beschleunigt.


Anmelden zum Antworten