Heap Performance



  • Das mit dem 1 GB ist jetzt behoben, jetzt kommt nur noch ne Access-Violation.



  • @Gregor: Hätte dir deine dumme Idee nicht früher einfallen können? Guck mal:

    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    /* Analysis:
    Occurences of 'new's:
    0: 100
    1: 100
    2: 14506287
    3: 24201675
    4: 100
    5: 18946842
    6: 100
    7: 17061342
    8: 100
    9: 100
    11: 16037221
    13: 15367557
    17: 14882188
    */
    
    int *Xfree[18] = { 0 };
    int Xu[18] = { 0 };
    
    inline int *Xnew(size_t size) {
        if (size < 1 || size > 17 || !Xfree[size]) return new int[size];
        int *result = Xfree[size];
        Xfree[size] = * (int **) Xfree[size];
        --Xu[size];
        return result;
    }
    
    inline void Xdel(int *p, size_t size) {
        if (size < 1 || size > 17) { delete [] p; return; }
        int *x = Xfree[size];
        *(int **)p = x;
        x = p;
        if (++Xu[size] > 8192) {
            int i = 0;
            while (*x) {
                p = x;
                x = * (int **) x;
                delete [] p;
                cout << i << ": " << p << endl;
                i++;
            }
            Xu[size] = 0;
        }
        Xfree[size] = x;
    }
    
    int main()
    {
        const int size = 1000;
        int *array[size];
        const int sizes[] = { 2, 3, 5, 7, 11, 13, 17 };
        int i, j, k, element;
        size_t length[size] = {0};
        long sum = 0;
        clock_t time = clock();
        for (i = 0; i < size; ++i) {
            int s = i % 10;
            array[i] = Xnew(s);
            length[i] = s;
            for (j = 0; j < s; ++j)
                array[i][j] = j;
        }
        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];
                Xdel(array[element], length[element]);
                array[element] = Xnew( length[element] = sizes[i % 7] );
                for (k = 0; k < length[element]; ++k) 
                    array[element][k] = k;
            }
        int *ref[size];
        int _ref[size] = { 0 };
        for (i = 0; i < 10; ++i) {
            ref[i] = &_ref[i];
            ++*ref[i];
        }
        for (i = 10; i < size; ++i) {
            //Xdel(array[i], length[i]);
            array[i] = array[i % 10];
            length[i] = length[i % 10];
            ref[i] = ref[i % 10];
            ++*ref[i];
        }
        for (i = 100000; i > 0; --i)
            for (j = 0; j < 5000000; j += i) {
                element = j % size;
                for (k = 0; k < length[element]; ++k)
                    sum += array[element][k]++;
                if (--*ref[element] <= 0) {
                    Xdel(array[element], length[element]);
                }
                array[element] = Xnew( length[element] = sizes[i % 7] );
                ref[element] = &_ref[element];
                _ref[element] = 1;
                for (k = 0; k < length[element]; ++k)
                    array[element][k] = k;
            }
        cout << clock() - time << " ms (or usec)" << endl;
        cout << sum << endl;
        return 0;
    }
    

    Wird ein unglültiges Dingsie gefreed.



  • Ich kriege leider noch einen Fehler bei der Ausführung:

    Die Anweisung in "0x77f42e9d" verweist auf Speicher in "0x00000001". Der Vorgang "written" konnte nicht auf dem Speicher...

    Funktioniert der Code bei dir schon?



  • Hmm, mit dem g++ testen tu. Aber schau doch, was ich direkt unter den Code gepostet hab.



  • Du hast ja mal nen komischen Rechner. Mein g++-Prog (2.95, 3.2 tut nich) spuckt nur Segfault aus.



  • Original erstellt von Mr. N:
    Du hast ja mal nen komischen Rechner. Mein g++-Prog (2.95, 3.2 tut nich) spuckt nur Segfault aus.

    Das war ne Fehlermeldung, die von Windows kam!



  • Aber ich muss zugeben, dass ich den Überblick verloren hab. Du bist wie ein typischer unwissender Kunde ;). Mit Ideen, die ins bereits hochoptimierte Konzept reinsollen :p.



  • Original erstellt von Mr. N:
    Du bist wie ein typischer unwissender Kunde ;). Mit Ideen, die ins bereits hochoptimierte Konzept reinsollen :p.

    ...und als typischer Kunde bin ich natürlich "menschlich enttäuscht", wenn du den Fehler nicht wegkriegst! 😃 😃



  • Menno :D. Aber erstmal hat anderes Priorität. Mal schaun ob ich n Challenge für dich find.


Anmelden zum Antworten