Heap Performance



  • Original erstellt von Mr. N:
    @Gregor: :). Ehrlich gesagt erkenne ich nicht, wo Reference-Counting in deinem Programm zum Einsatz kommt.

    Vielleicht fällt es dir auf, wenn du dir dieses Programm mal anguckst:
    [java]
    public class TestMemory
    {

    /** Creates a new instance of TestMemory */
    public TestMemory ()
    {
    }

    public static void main (String [] args)
    {
    int size = 1000;
    int [][] array = new int [size][];
    int [] sizes = {2,3,5,7,11,13,17};
    int i,j,k,element;
    int sum = 0;
    long time = System.currentTimeMillis ();
    for (i = 0 ; i < size ; ++i)
    {
    array [i] = new int [i%10];
    for (j = 0 ; j < array[i].length ; ++j)
    {
    array[i][j] = j;
    }
    }
    System.out.println(sum);
    for (i = 1 ; i < 100000 ; ++i)
    {
    for (j = 0 ; j < 5000000 ; j+=i)
    {
    element = j%size;
    for (k = 0 ; k < array[element].length ; ++k)
    {
    sum += array[element][k];
    }
    array[element] = new int [sizes[i%sizes.length]];
    for (k = 0 ; k < array[element].length ; ++k)
    {
    array[element][k] = k;
    }
    }
    }
    System.out.println(sum);
    for (i = 1 ; i < 100 ; ++i)
    {
    System.arraycopy (array,0,array,i*10,10);
    }
    System.out.println(sum);
    for (i = 100000 ; i > 0 ; --i)
    {
    for (j = 0 ; j < 5000000 ; j+=i)
    {
    element = j%size;
    for (k = 0 ; k < array[element].length ; ++k)
    {
    sum += array[element][k];
    ++array[element][k];
    }
    array[element] = new int [sizes[i%sizes.length]];
    for (k = 0 ; k < array[element].length ; ++k)
    {
    array[element][k] = k;
    }
    }
    }
    array = null;
    System.gc();
    System.out.print(System.currentTimeMillis () - time);
    System.out.println (" ms");
    System.out.println(sum);
    }
    }[/code]
    Hier kommt nämlich etwas anderes raus als beim alten Programm. Beim alten Programm kommt 444560896 heraus, hier kommt 445031146 heraus.



  • peinlich, peinlich ;):

    sum += array[element][k];
                   ++array[element][k];
    

    meinen tust du natürlich:

    sum += array[element][k]++;
    


  • > 1 GB Speicherverbrauch ist nicht normal für deine Variante, oder?



  • Original erstellt von Mr. N:
    > 1 GB Speicherverbrauch ist nicht normal für deine Variante, oder?

    Ich denke nicht! Java kann in denGrundeinstellungen nur 64 MB Speicher verbrauchen. Alles, was darüber liegt, ist prinzipiell nicht normal!



  • 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