?
Hallo,
Ich habe ein etwas umfangreicheres Programm mit einem genetischen Algorithmus geschrieben... im Endeffekt wird iterativ immer eine neue Generation erstellt und evaluiert, wobei das Evaluieren am längsten braucht. Nun habe ich gemerkt, dass das Evaluieren jede Runde/Generation länger braucht... selbst bei gleichen Ausgangsbedingungen,zB:
180s
190s
205s
225s
250s
Ich konnte mir das nicht erklären, weil ich sichergestellt habe, dass immer das selbe evaluiert wird. Es werden zwar jede Runde viele Daten erstellt und verwaltet, aber die müssen ja alle nach Verlassen der entsprechenden Funktionien wieder zerstört werden... statisch sind nur ein paar simple Strings/Funktionen.
Um ganz sicherzugehen, steckt nun alles in einer Klasse, deren Objekt für jede Runde neu erstellt wird (die Daten werden aus einer Datei geladen). Das heißt ich habe nun eine Main-Methode die in einer Schleife nichts anderes macht außer
xy=new superklasse();
xy=null; //nur um sicher zu gehen
System.gc();
Im Konstruktor passiert dann der Rest... und immernoch dauert es mit jeder Runde länger... was ich mir nun gar nicht mehr erklären kann, weil das Objekt ja immer komplett neu erzeugt wird und der selbe Datensatz von der Platte gelesen wird.
Langsam zweifel ich an Java (1.6)... gibt es denn irgendwelche Methoden die nicht zerstört werden und einen Einfluss auf die Performance haben könnten. Mir fallen nur statische Sachen und das ist hier wie gesagt nichts besonderes. Vieleicht final Sachen? Könnte ich wirklich irgendwo so einen komischen Bug gebastelt haben, der sich so auswirkt... immerhin werden bis an die 40 Threads gestartet, die aber auch alle wieder verschwinden!
Als letzte Alternative würde ich ein C-Programm oder Bashscript schreiben, dass die Iteration übernimmt.
Ich bin wirklich über jeden Vorschlag dankbar weil mich das hier wirklich zum Verzweifeln bringt.
Vielen Dank