Die Erstellung von Objekten ist billig, ja, aber manchmal nicht billig genug.
Wenn Sie viele (und ich meine wirklich VIELE) temporäre Objekte in schneller Folge erstellen, sind die Kosten für den Garbage Collector beträchtlich. Doch selbst mit einem guten Profiler sind die Kosten nicht unbedingt leicht zu erkennen, da der Garbage Collector heutzutage in kurzen Intervallen arbeitet, anstatt die gesamte Anwendung für ein oder zwei Sekunden zu blockieren.
Die meisten Leistungsverbesserungen, die ich in meinen Projekten erzielen konnte, kamen entweder durch Vermeidung der Objekterstellung oder durch Vermeidung der gesamten Arbeit (einschließlich der Objekterstellung) durch aggressives Caching zustande. Egal wie groß oder klein das Objekt ist, es braucht immer noch Zeit, um es zu erstellen und die Referenzen und Heap-Strukturen dafür zu verwalten. (Und natürlich nehmen auch die Aufräumarbeiten und das interne Heap-Defragmentieren/Kopieren Zeit in Anspruch).
Ich würde nicht anfangen, religiös zu werden, wenn es darum geht, die Schaffung von Objekten zu vermeiden alle Kosten, aber wenn Sie ein Puzzlemuster in Ihrem Speicher-Profiler sehen, bedeutet das, dass Ihr Garbage Collector auf Hochtouren läuft. Und wenn Ihr Garbage Collector die CPU in Anspruch nimmt, ist die CPI für Ihre Anwendung nicht verfügbar.
Bezüglich der Zusammenführung von Objekten: Es ist schwierig, es richtig zu machen und nicht in Speicherlecks oder ungültige Zustände zu geraten oder mehr Zeit für die Verwaltung aufzuwenden, als man sparen würde. Daher habe ich diese Strategie nie verwendet.
Meine Strategie bestand darin, einfach unveränderliche Objekte anzustreben. Unveränderliche Dinge können leicht zwischengespeichert werden und helfen daher, das System einfach zu halten.
Aber egal, was Sie tun: Stellen Sie sicher, dass Sie Ihre Hotspots zuerst mit einem Profiler überprüfen. Vorzeitige Optimierung ist die Wurzel allen Übels.