Wieviel klassen haben große Projekte?



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



  • @Marc++us

    warum dauert das so lange? OK Millionen Zeilen aber wenn ich z.B mit dem VC kompiliere macht er ja die obj files und nur wenn ich Änderungen an den Dateien gemacht habe kompiliert er die veränderte Datei neu.

    Das würde bedeuten das Sehr viele Änderungen an einem Tag statt finden. Ist das richtig??



  • Du spielst jetzt auf inkrementelles Linken an?

    Das ist wohl richtig. Aber wenn Du wirklich eine Testversion machen willst, wirst Du nie inkrementell Linken... da kann man nämlich sein blaues Wunder erleben, gerade wenn sehr viele Module geändert wurden.

    Im Zweifelsfalle wird also ein echter "Build" immer mit einem absoluten Rebuild gemacht.



  • Original erstellt von Marc++us:
    **Du spielst jetzt auf inkrementelles Linken an?
    Das ist wohl richtig. Aber wenn Du wirklich eine Testversion machen willst, wirst Du nie inkrementell Linken... da kann man nämlich sein blaues Wunder erleben, gerade wenn sehr viele Module geändert wurden.
    **

    hehe, wo du's gerade sagst. ich brauch mir nur vorzustellen, daß einer von 100 entwicklern (und einen gibts in jedem projekt, dem sowas gelingt) gerade entdeckt, daß er seit 2 wochen scheiße gebaut hat und sein backup von vor 2 wochen rauskramt und dann schlimmerweise die zwei wochen alte datei für weitere 4 wochen nicht verändert, sondern an anderen rummacht.
    wenn der auf dateiänderungsdatendaten achtende compiler jetzt die alte datei deswegen ignoriert, ist aber für 4 wochen herrliches chaos angesagt.


Anmelden zum Antworten