Heap Performance



  • Ich sehe gerade, Gregor hat keine straight-forward java Version gepostet. Die möchte ich auch sehen.



  • Original erstellt von Mr. N:
    Ich sehe gerade, Gregor hat keine straight-forward java Version gepostet. Die möchte ich auch sehen.

    Was meinst du?



  • Original erstellt von Gregor:
    Was meinst du?

    Nix 😃
    Das mit dem Array auf den Heap find ich nur gewöhnungsbedürftig.

    Hmm. Dieser Code:

    for (i = 100000; i > 0; --i)
        for (int j = 0; j < 5000000; ++j)
            sum = (sum + sum % 4) % 6;
    

    Rechnet ziemlich lange. Mal sehen, ob die Zahlen in Gregors Progrämmchen stimmen.



  • Hehe. Versehentlich j++ statt j += i; 😃



  • Das guut Code sei:

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <cassert>
    
    using namespace std;
    
    int main()
    {
        const int size = 1000;
        static int *array[size];
        const int sizes[] = { 2, 3, 5, 7, 11, 13, 17 };
        int length[size] = {0};
        unsigned long sum = 0;
        clock_t time = clock();
        int i;
        for (i = 0; i < size; ++i) {
            int s = i % 10;
            array[i] = new int[s];
            length[i] = s;
            for (int j = 0; j < s; ++j)
                array[i][j] = j;
        }
        for (i = 1; i < 100000; ++i)
            for (int j = 0; j < 5000000; j += i) {
                int element = j % size;
                int k;
                for (k = 0; k < length[element]; ++k) 
                    sum += array[element][k];
                delete [] array[element];
                array[element] = new int[ length[element] = sizes[i % 7] ];
                for (k = 0; k < length[element]; ++k) 
                    array[element][k] = k;
            }
        for (i = 10; i < size; ++i) {
            delete [] array[i];
            array[i] = new int[ length[i] = length[i % 10] ];
            memcpy(array[i], array[i % 10], length[i]);
        }
        for (i = 100000; i > 0; --i)
            for (int j = 0; j < 5000000; j += i) {
                int element = j % size, k;
                for (k = 0; k < length[element]; ++k)
                    sum += array[element][k];
                delete [] array[element];
                array[element] = new int[ length[element] = sizes[i % 7] ];
                for (k = 0; k < length[element]; ++k)
                    array[element][k] = k;
            }
        cout << clock() - time << " ms (or usec)" << endl;
        cout << sum << endl;
        return 0;
    }
    


  • Output:

    26906 ms (or usec)
    3963054733
    

    27 Sekunden. Unhandoptimiert 😛



  • ...und bei mir kommt mit "j += i" folgendes heraus :

    144 Sekunden, 1054756072

    Weder dein Ergebnis, noch dieses hier stimmt mit dem der Vorgabe überein! ...scheint also doch nicht so ganz straight-Forward zu sein, gell?



  • Wie wir gerade im C++ Forum erfahren haben soll clock ja garnicht sinnvoll sein! 😡 😡 😡



  • Original erstellt von <clock clock>:
    Wie wir gerade im C++ Forum erfahren haben soll clock ja garnicht sinnvoll sein! 😡 😡 😡

    ???



  • Original erstellt von <clock clock>:
    Wie wir gerade im C++ Forum erfahren haben soll clock ja garnicht sinnvoll sein! 😡 😡 😡

    Warum? Zu ungenau? Hier interessieren doch eh nicht die Millisekunden.



  • funktion, die die laufzeit des programms wiedergibt

    Da steht was davon, das auch minütliche Unterschiede entstehen können



  • Nicht bei unseren Programmen.



  • MrN--;



  • Original erstellt von < >:
    MrN--;

    Öhm. Meine Antwort ist doch nicht gelogen, oder irgendwie falsch? Wie soll ich das verstehen? Als persönlichen, ungerechtfertigten Angriff?



  • Als unoptimierte! Abwertung. 😃



  • @Gregor: auf was ist sum nach jedem Beenden einer for (i...) schleife gesetzt?
    /me kriegt für das hier

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <cassert>
    
    using namespace std;
    
    int main()
    {
        const int size = 1000;
        static int *array[size];
        const int sizes[] = { 2, 3, 5, 7, 11, 13, 17 };
        int i, j, k, element;
        int length[size] = {0};
        unsigned long sum = 0;
        clock_t time = clock();
        for (i = 0; i < size; ++i) {
            int s = i % 10;
            array[i] = new int[s];
            length[i] = s;
            for (j = 0; j < s; ++j)
                array[i][j] = j;
        }
        cout << sum << endl;
        for (i = 1; i < 100000; ++i)
            for (j = 0; j < 5000000; j += i) {
                element = j % size;
                for (k = 0; k < length[element]; ++k) 
                    sum += array[element][k];
                delete [] array[element];
                array[element] = new int[ length[element] = sizes[i % 7] ];
                for (k = 0; k < length[element]; ++k) 
                    array[element][k] = k;
            }
        cout << sum << endl;
        for (i = 10; i < size; ++i) {
            delete [] array[i];
            array[i] = new int[ length[i] = length[i % 10] ];
            memcpy(array[i], array[i % 10], length[i]);
        }
        cout << sum << endl;
        for (i = 100000; i > 0; --i)
            for (j = 0; j < 5000000; j += i) {
                element = j % size, k;
                for (k = 0; k < length[element]; ++k)
                    sum += array[element][k];
                delete [] array[element];
                array[element] = new int[ length[element] = sizes[i % 7] ];
                for (k = 0; k < length[element]; ++k)
                    array[element][k] = k;
            }
        cout << sum << endl;
        cout << clock() - time << " ms (or usec)" << endl;
        cout << sum << endl;
        return 0;
    }
    

    folgenden output:

    0
    2369722731
    2369722731
    3765571316
    26718 ms (or usec)
    3765571316
    


  • Original erstellt von < >:
    Als unoptimierte! Abwertung. 😃

    Tut mir leid, da ich nicht verstehe, warum, kann ich _diese_ Erklärung nicht akzeptieren.



  • Es gibt Überläufe, die aber wohl auf bei beiden Programmen gleich sein sollten:

    0
    -1925244565
    -1925244565
    56411 ms
    444560896



  • @Gregor: bei dir fehlt da noch eins :). unsigned weg und:

    0
    -1925244565
    -1925244565
    -529395980
    28296 ms (or usec)
    -529395980
    

    wo der fehler (?) liegen müsste, is jetz klarer



  • Dieser Code, macht der das gleiche wie dein arraycopy? Kannst du das Arraycopy nich auch selber schreiben?

    for (i = 10; i < size; ++i) {
            delete [] array[i];
            array[i] = new int[ length[i] = length[i % 10] ];
            memcpy(array[i], array[i % 10], length[i]);
        }
    

    [ €dit: Zu früh geklickt ]

    [ Dieser Beitrag wurde am 03.12.2002 um 18:27 Uhr von Mr. N editiert. ]


Anmelden zum Antworten