allocinator schrieb:
Es wird an sich versucht mehrere Objekte der gleichen Klasse (mit anderen Werten) zu verwenden. Dabei wird recht viel Speicher allokiert.
Klassen und malloc? Klingt nach C++ gemischt mit C. Ich hoffe, du weißt, was du tust und wann malloc für Klassen in Ordnung ist.
Alle einzeln laufen etwa gleich schnell. Wenn ich sie alle laufen lasse, benötigen -meiner Meinung nach- die realloc's sehr viel Zeit.
Was heißt hier Meinung? Woher kommt die Meinung? Miss doch nach! Stichwort: Profiler.
**Ist es möglich, dass die realloc's mehr Zeit benötigen, wenn der Prozess bereits viel Speicher belegt? Weil es wird ja nur mehrmals das gleiche gemacht.
**
Du stellst die Frage ungeschickt. Programmierer sagen ungerne, dass etwas unmöglich ist, wenn irgendein Szenario vorstellbar wäre, bei dem es doch möglich ist. Was würde dir solch eine Auskunft nützen? Die Frage ist schließlich, warum dein Programm langsam ist, nicht, ob realloc langsam werden kann. Aber wie ich schon sagte, sind solche Szenarien denkbar. Möglicherweise liegt eines davon vor. Mögliche Faktoren:
-Die Speicherblöcke sind so ungünstig fragmentiert, dass dauernd neu allokiert werden muss
-Das Programm hat eine ungünstige Reallokationsstrategie und ruft daher realloc unnötig oft auf
-Reallokieren eines großen Blocks ist nun einmal langsam, aber das lässt sich nicht vermeiden. Man kann aber vermeiden, dass überhaupt reallokiert werden muss.
Könnte das am Speichermanagement liegen?
Für diese Frage gilt das gleiche wie oben. Natürlich könnte es daran liegen. Wir wissen überhaupt gar nichts über dein Programm, außer welche Vermutungen du hast. Wenn du fragen würdest, ob es an statischer Ladung im Resetschalter liegen könnte, würden wir auch "Ja" antworten.
Der code stammt nicht von mir, etwas beschleunigen konnte ich bereits indem ich immer größere Blöcke auf einmal allokiere.
Wenn der Code das nicht von vornherein so gemacht hat, dann ist das ein schlechtes Zeichen. Mit der gegebenen, spärlichen Information würde ich auf einen schlechten Algorithmus oder Fehler in der Umsetzung tippen. Möglicherweise im Zusammenhang mit der realloc-Nutzung, möglicherweise nicht.
Werd das nach und nach mit vector ersetzen, bin nicht so der c Programmierer und hatte mit malloc realloc noch nicht so viel zu tun.
Sei dir im Klaren, dass der vector immer reallokiert, wenn seine Capacity nicht ausreicht. Eine Umsetzung, die ihre Capacity einfach so erhöht (also wie realloc ohne Reallokation) ist zwar vorstellbar, existiert meines Wissens nach aber nicht. Aber der vector sollte dafür eine clevere Allokationsstrategie fahren, so dass dieser Fall selten eintritt.