was muss ein Progammierer können?



  • Ich glaube, bei Variante 3 würdest du mit C++ ohne Optimierung auch etwa auf die Java-Zeit kommen! ...hast du es schon ausprobiert?

    EDIT : Anscheinend muss man ja als Java-Programmierer mehr von der Hardware wissen, als wenn man ein C++-Programmierer ist, da bei C++ die ganzen Optimierungen in diese Richtung vom Compiler gemacht werden! 😃 🙂

    [ Dieser Beitrag wurde am 05.01.2003 um 22:24 Uhr von Gregor editiert. ]



  • Original erstellt von Marc++us:
    Naja, mit der Taktik der vollständigen Information wurden aber schon Schlachten gewonnen. 😉

    Hängt von der Größe der Schlachten ab. Sonst kommt aus dem Abhalten von Briefings, dem Lesen und Schreiben von Mails und Memos nicht mehr raus... 😃

    Haste ´n Team oder ´n Heer?



  • @Gregor: Das glaube ich zwar nicht. Aber testen kann ja nicht schaden.



  • Getestet:
    Unoptimiert:

    Zahl: 20000
    Zeit: 39984
    Zahl: 20000
    Zeit: 23937
    Zahl: 20000
    Zeit: 10672
    

    Optimiert:

    Zahl: 20000
    Zeit: 28562
    Zahl: 20000
    Zeit: 5453
    Zahl: 20000
    Zeit: 5469
    

    Code:

    #include <iostream>
    #include <time.h>
    
    int main() {
        const int N = 150000, M = 20000;
    
        int a[N] = {0};
    
        clock_t t = clock();
    
        int i, j;
    
        int x = 0;
    
        for (i = 0; i < M; i++) 
            for (j = 0; j < N; j++)
                x &= a[j]++;
    
        clock_t d = clock() - t;
    
        std::cout << "Zahl: " << x + a[20] << std::endl << "Zeit: " << d << std::endl;
    
        memset(a, 0, sizeof(a));
    
        t = clock();
        x = 0;
    
        for (i = 0; i < N; i++)
            for (j = 0; j < M; j++)
                x &= a[i]++;
    
        d = clock() - t;
    
        std::cout << "Zahl: " << x + a[20] << std::endl << "Zeit: " << d << std::endl;
    
        memset(a, 0, sizeof(a));
    
        t = clock();
        x = 0;
    
        for (i = 0; i < N; i++) {
            int v = a[i];
            for (j = 0; j < M; j++)
                x &= v++;
            a[i] = v;
        }
    
        d = clock() - t;
    
        std::cout << "Zahl: " << x + a[20] << std::endl << "Zeit: " << d << std::endl;
    }
    


  • @Gregor: wie du siehst optimiert Java doch ein bisschen.



  • Original erstellt von Mr. N:
    @Gregor: wie du siehst optimiert Java doch ein bisschen.

    Ja! OK! Stimmt!

    ...übrigens mag mein g++ die 2. Variante überhaupt nicht. bei stärkster Optimierung braucht sie fast 50% mehr Zeit, als Variante 1. ...Variante 3 wird sehr gut optimiert.

    ...vielleicht sollte man auch bei C++ dem Compiler so viel Optimierungen, wie möglich abnehmen, so dass er selbst nur noch wenig machen muss. ...dann dürfte zumindest ähnliche Performance auf verschiedenen Compilern eher der Fall sein.

    BTW : Das ist eine Sache, die mich an C++ sehr stört. Die Performance der Programme ist sehr stark compilerabhängig. Das kann aber auch daran liegen, dass sich viele einfach viel zu sehr auf die tollen Optimierungen ihres Compilers verlassen.

    [ Dieser Beitrag wurde am 06.01.2003 um 19:40 Uhr von Gregor editiert. ]



  • Das ist kein Grund gegen C++ :D. Welchen g++ hast du?



  • Original erstellt von Mr. N:
    Das ist kein Grund gegen C++ :D. Welchen g++ hast du?

    Ein Grund gegen C++ ist das sicherlich nicht. ...ich finde es aber trotzdem doof!

    Ich habe g++ aus MinGW 2.0.0-3. Das dürfte also eine recht neue Version sein.



  • $ g++ -v
    Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/3.2/specs
    Configured with: /netrel/src/gcc-3.2-3/configure --enable-languages=c,c++,f77,java --enable-libgcj --enable-threads=posi
    x --with-system-zlib --enable-nls --without-included-gettext --enable-interpreter --disable-sjlj-exceptions --disable-ve
    rsion-specific-runtime-libs --enable-shared --build=i686-pc-linux --host=i686-pc-cygwin --target=i686-pc-cygwin --enable
    -haifa --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --includedir=/nonexistent/include --libexecd
    ir=/usr/sbin
    Thread model: posix
    gcc version 3.2 20020927 (prerelease)
    


  • Und mit meinem g++ unter Cygwin:

    Zahl: 20000
    Zeit: 27594
    Zahl: 20000
    Zeit: 7734
    Zahl: 20000
    Zeit: 5657
    


  • C:\Dokumente und Einstellungen\Otaku\Desktop\Temp>g++ -o Test.exe Test.cpp

    C:\Dokumente und Einstellungen\Otaku\Desktop\Temp>Test
    Zahl: 20000
    Zeit: 30183
    Zahl: 20000
    Zeit: 24735
    Zahl: 20000
    Zeit: 18267

    C:\Dokumente und Einstellungen\Otaku\Desktop\Temp>g++ -o Test.exe Test.cpp -O3

    C:\Dokumente und Einstellungen\Otaku\Desktop\Temp>Test
    Zahl: 20000
    Zeit: 22812
    Zahl: 20000
    Zeit: 30394
    Zahl: 20000
    Zeit: 4306

    C:\Dokumente und Einstellungen\Otaku\Desktop\Temp>g++ -v
    Reading specs from C:/MinGW/bin/../lib/gcc-lib/mingw32/3.2/specs
    Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=
    mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable
    -languages=f77,c++,objc,ada --disable-win32-registry --disable-shared
    Thread model: win32
    gcc version 3.2 (mingw special 20020817-1)

    Zum Vergleich die Java-Version :

    E:\JavaProjects\CacheTest>java CacheTest
    Variante 1 :
    Zahl : -1294967296
    Zeit : 23755
    Variante 2 :
    Zahl : -1294967296
    Zeit : 18146
    Variante 3 :
    Zahl : -1294967296
    Zeit : 7410

    E:\JavaProjects\CacheTest>java -version
    java version "1.4.1_01"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
    Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode)



  • @Gregor: Teste das mit -O3 nochmal. Wenns nicht klappt kannst du dich über _deinen_ g++ ärgern.



  • Original erstellt von Mr. N:
    @Gregor: Teste das mit -O3 nochmal. Wenns nicht klappt kannst du dich über _deinen_ g++ ärgern.

    Ich habe das schon diverse male neukompiliert und getestet! ...und ich ärgere mich über den Compiler! 😡 😡 😃


Anmelden zum Antworten