Wieviel klassen haben große Projekte?



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



  • das habe ich nochwas anzumerken

    TestClass testClass = TestClass();
    time = clock();

    man müßte doch erst die Zeit holen und dann das Objekt erstellen da das Objekt erstellen ja dazugehört.



  • Außerdem ist das ein günstige Klasse.

    Da in der Regel mehr Atribute hat und ich diese alle auf einmal nicht benötige.

    OPP hat ja andere Argumente dafür.



  • Original erstellt von <Günter>:
    ich habe gehört, dass UT2003 eine halbe Stunde zum compilen braucht!
    wielange braucht dann windows?

    Ich habe mal gelesen, daß der komplette Compiliervorgang über eine Nacht braucht. Allerdings bezog sich das auf Windows 95...

    Daher gab's im Entwicklerteam auch eine Strafe: wer durch eine Nachlässigkeit daran schuld war, daß in seinem Code die Compilierung wegen eines Syntaxfehlers abbrach, hatte am nächsten Tag die Nachtschicht und mußte den neuen Compilervorgang überwachen (denn er hätte solche Fehler natürlich lokal vorher herausfinden können und müssen).

    Steht in "Nie wieder Bugs!" von Steve Maguire, der zum Excel-Entwicklungsteam gehört. Leider ist der Titel nicht mehr im Handel erhältlich.


Anmelden zum Antworten