was muss ein Progammierer können?



  • @Gregor: Insider-Joke!! 😃



  • So wie bei **Voraus (V_o_r_r_a_u_s), was? 😃

    cya :)**



  • Original erstellt von Prof84:
    Unternehmen, die groß genug sind, haben ein hinreichend ausgeprägtes Anforderungsmanagement, so dass nicht jeder Programmierer über den vollständigen System-, Nutzungs- und Funktionsumfang informiert werden muss, was ja auch Kosten verursacht.

    Naja, mit der Taktik der vollständigen Information wurden aber schon Schlachten gewonnen. 😉



  • humm..... nächste Frage zu dem Code... was bitte macht: x &= a[i]++; d.h. speziell der &= Operator? 😕 Bitweises Und, oder?

    BTW: wieso ist die 2. Variante jetzt eigentlich schnelller? 😕 *dummVorkomm*



  • ein programmierer muss auch gut *****kriechen können 😉



  • @Blue-Tiger: Was x &= ++a[i]; macht? Das ist das gleiche wie x = x & ++a[i]; da x aber von vorneherein 0 ist, optimiert der das nicht weg und ich kriege bei Variante 2 nicht 0 ms. Den Unterschied zwischen den zwei Varianten zeig ich mal an Pseudo-Assembler:

    Variante 1:

    SET B, 0
    SET D, 20000
    L1:
    SET C, 1500000
    L2:
    SET A, a[C]
    INCREMENT A
    AND B, A
    SET a[C], A
    DECREMENT C
    IF C IS NOT 0 JUMP TO L2
    DECREMENT D
    IF D IS NOT 0 JUMP TO L1
    

    Variante 2:

    SET B, 0
    SET D, 150000
    L1:
    SET C, 20000
    SET A, a[D]
    L2:
    INCREMENT A
    AND B, A
    DECREMENT C
    IF C IS NOT 0 JUMP TO L2
    SET a[D], A
    DECREMENT D
    IF D IS NOT 0 JUMP TO L1
    



  • Original erstellt von Blue-Tiger:
    **
    BTW: wieso ist die 2. Variante jetzt eigentlich schnelller? 😕 *dummVorkomm***

    Hmmm... ich habe jetzt mal die drei Applets von Seite 2 ausprobiert.
    Ergebnis :

    kleinstes Array : Variante 2 braucht 96% der Zeit von Variante 1.
    mittleres Array : Variante 2 braucht 85% der Zeit von Variante 1.
    größtes Array : Variante 2 braucht 78% der Zeit von Variante 1.

    ...scheint ja irgendwie größenabhängig zu sein, oder?! ...und jetzt verrate ich dir noch, dass der Unterschied beim kleinsten Array garnicht an der Größe liegt, sondern durch irgendwas, was von Java verursacht wird. Nehmen wir einfach mal an, dass beim kleinsten Array beide Varianten die gleiche Zeit brauchen.

    ...jetzt gucken wir uns mal die Größen der Arrays etwas genauer an (ein int umfaßt 4 Byte):
    kleinstes Array : 15000 * 4 = 60000 Byte = 58,6 kB.
    mittleres Array : 150000 * 4 = 600000 Byte = 585,9 kB.
    größtes Array : 1500000 * 4 = 6000000 Byte = 5,7 MB.

    ...und jetzt verrate ich dir noch, dass ich nen Pentium 4M mit 512 kB Cache habe.

    ...und jetzt darfst du raten. (Bei der C++-Variante ist es noch etwas anders. Die ist eher mit der 3. Java-Variante vergleichbar.)



  • @Gregor: Die 2. C++ Variante ist vom Code her mit der 2. Java Variante vergleichbar, von der Performance her jedoch eher mit der 3. Java Variante - soviel Zeit muss sein *g*.



  • Original erstellt von Mr. N:
    @Gregor: Die 2. C++ Variante ist vom Code her mit der 2. Java Variante vergleichbar, von der Performance her jedoch eher mit der 3. Java Variante - soviel Zeit muss sein *g*.

    Nicht, wenn man bedenkt, was der Compiler daraus macht. Sagen wir : Die 2. Assembler-Variante, die du gezeigt hast ist eher mit der 3. Java-Variante, als mit der 2. Java-Variante vergleichbar.



  • @Gregor: Mach ich das mit Ohne Optimierung, dann müsste ich auch etwa die Java Zeiten kriegen. Bis auf Variante 3, die Java da optimiert.



  • 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
    

Anmelden zum Antworten