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.