Probiers mal damit:
Anstelle einer Liste ein Array mit 5 Milionen Einträgen.
Code:
Raumschiff[] angreifer= new Raumschiff[5000000];
int erstepos=0;
int count=0;
for (count = erstepos; count < eingabe_angreifer_leichter_jäger+erstepos; count++)
angreifer[count] = new leichter_jäger(schildbonus, hüllenbonus, angriffsbonus);
erstepos=erstepos+eingabe_angreifer_leichter_jäger;
for (count = erstepos; count < eingabe_angreifer_schwere_jäger+erstepos; count++)
angreifer[count] = new schwerer_jäger(schildbonus, hüllenbonus, angriffsbonus);
Anstelle das du Elemente Löschst, fügst du einen null wert in die Liste ein. Ausserdem kannsrt du dir in 2 Variablen merken bei welchem Shiff du gerade in der Liste bist, dadurch musst du weniger schauen wie viele schiffe du am Anfang der Liste schon gelöscht hast.
Oder, sofern du mehrere Simulationen im gleichen Programmlauf machst, würde ich den Raumschiffen einen Boolschne wert 'besigt' geben und dann beim erneuten Befüllen keine neuen Objekte machen, sondern versuchen so viele bestehende Schiffe wie möglich weiter zu verwenden. Dadurch bist du schnell 2-3 mal schneller beim 2ten befüllen solange die Anzahl Schiffe nicht zu sehr variiert, und nur im absoluten Worst case langsamer als wenn du jedes Schiff neu machst.
zb. als sehr unoptimierte Variante:
Code:
int erstepos=0;
int count=0;
for (count = erstepos; count < eingabe_angreifer_leichter_jäger+erstepos; count++)
{
if(angreifer[count] is leichter_jäger)
{
angreifer[count].Renew(schildbonus, hüllenbonus, angriffsbonus);
}else{
angreifer[count](new leichter_jäger(schildbonus, hüllenbonus, angriffsbonus));
}
}
...
Das ist im Idealfall (gleiche Anzahl schiffe von jedem Typ) um ein vielfaches schneller als wenn du jedes mal ein neues Objekt erstellst, aber selbst im worst case nur unmerklich langsamer.
Allerdings lässt sich die Effizienz noch deutlich verbessern, zb. indem du schaust ob es später noch schiffe vom entsprechenden Typ gibt und dir merkst wo du das letzte Schiff her hast, die hilft wenn am anfang eine der zahlen, zb. eingabe_angreifer_leichter_jäger, kleiner wurde als beim ersten durchlauf, da die nachfolgenden dann dennoch auf die maximale anzahl Ihrer Schiffe zurückgreifen können.
Für weitere Obtimierungen müsstest du dir dann abseits davon Metainformationen merken, also bei welchem Eintrag fängt eine bestimmte Schiffsklasse an, dadurch könntest du die maximale Anzahl Objekte weiter verwenden (bei richtiger implementation), was sich im durchschnitt in maximaler Performance widerspiegeln würde.
Ausserdem kannst du dir überlegen die beiden Listen (angreifer und verteidiger) per Multithreading Paralell zu füllen. Dies kann je nachdem nochmals einen guten Geschwindigkeitsschub bedeuten
Was so unendlich lange dauert, ist das erstellen der Objekte, also deine bis zu 10 mio. new Einträge, das zuweisen der variablen ist dagegen vernachlässigbar.
Und äöü sowie scharfe S solltest du in C# nicht verwenden, auch wenn es geht
Poste doch sonst mal den kompletten Code als zip, da kann ich dann sehen wo man sonst so noch optimieren könnte
EDIT: Mehrthreadiges befüllen bringt nur wenig mehr Leistung auf eine normalen Rechner (VM, 6GB RAM Dual Channel 1333, i7 der ersten gen)
Das wiederverwenden der Objekte bedeutet eine Beschleunigung von bis zu 1000% gegenüber dem neu erstellen jedes Objektes, bei einem Thread. Wobei das neu zuweisen von Multithreading im geringen umfang (so 4 Threads) durchaus noch etwas mehr Performance rausholen lässt.