Der einzige Weg, um herauszufinden, ist zu messen.
Die Variante "Typ1" ist nicht zuverlässig oder wird in keiner Weise empfohlen, da nicht alle Typen konstruiert werden können. Schlimmer noch, es reserviert Speicher, der Garbage Collector sein muss und ruft die Objektkonstruktoren auf.
Für die verbleibenden zwei Optionen ist "type3" auf meinem Rechner etwa doppelt so schnell wie "type1" sowohl im Debug- als auch im Release-Modus. Denken Sie daran, dass dies nur für meinen Test gilt - die Ergebnisse sind möglicherweise für andere Prozessortypen, Maschinentypen, Compiler oder .NET-Versionen nicht zutreffend.
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
var y = typeof(Program).ToString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Restart();
for (int i = 0; i < 10000000; i++)
{
var y = typeReference.ToString();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Das sagte, es ist ein bisschen alarmierend diese Frage wird ohne eine klare Anforderung gestellt. Wenn Sie ein Leistungsproblem festgestellt haben, haben Sie wahrscheinlich bereits ein Profil erstellt und wissen, welche Option besser ist. Das sagt mir, dass dies wahrscheinlich vorzeitige Optimierung ist - Sie kennen das Sprichwort, "vorzeitige Optimierung ist die Wurzel allen Übels".
Programmiercode wird nicht nur nach Leistung gemessen. Es wird auch durch Korrektheit, Entwicklerproduktivität und Wartbarkeit gemessen. Erhöhen Sie die Komplexität Ihres Codes ohne eine starke Grund nur überträgt diese Kosten auf woanders. Was ein Nicht-Problem sein könnte, hat sich jetzt und in Zukunft zu einem ernsthaften Produktivitätsverlust für die zukünftigen Betreuer der Anwendung entwickelt.
Meine Empfehlung wäre, immer die "type1" Variante zu verwenden. Der von mir aufgeführte Messcode ist kein realistisches Szenario. Das Caching von typeof zu einer Referenzvariable hat wahrscheinlich eine Menge Nebenwirkungen, insbesondere in der Art, wie .NET Assemblys lädt. Anstatt sie nur bei Bedarf laden zu lassen, kann es am Ende bei jeder Verwendung der Anwendung zu einer einzigen geladen werden - was eine theoretische Leistungsoptimierung zu einem sehr realen Leistungsproblem macht.
Erhalten Sie die Instanz zur Laufzeit (dynamisch, Generika?) Oder ist es bei compiletime angegeben? –
@newStackExchangeInstance Ich frage einfach im Zusammenhang mit dem genauen Code, den ich zur Verfügung gestellt habe. – Dan