Wurde mein Code Profiling und festgestellt, dass die Art und Weise, wie wir tun, farbige Konsole Text ist sehr teuer (die Mehrheit der Laufzeit).Gibt es eine schnellere Möglichkeit, Konsolenfarben einzustellen?
DateTime dt = DateTime.Now;
for (int i = 0; i <= 20000; i++)
{
ConsoleColor cf = Console.ForegroundColor;
ConsoleColor cb = Console.BackgroundColor;
Console.ForegroundColor = ConsoleColor.Red;
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine("Hello World");
Console.ForegroundColor = cf;
Console.BackgroundColor = cb;
}
System.Diagnostics.Debug.WriteLine((DateTime.Now - dt).TotalMilliseconds);
Diese einfache Schleife dauert 2,8 Sekunden, um auf meinem Rechner zu laufen. Wenn ich nur die WriteLine mache, sind es nur 600ms.
Nun bevor ich Troll Antworten bekomme :) fragen, warum ich die Farbe immer wieder einstellen, wenn sein fest einprogrammiert, DIES IST TEST CODE, in dem realen Code, die Vorder- und Hintergrundfarben sind auf ein paar verschiedenen Faktoren berechnet . Dieser Teil ist irrelevant. Dieser Code geht nur davon aus, dass sich die Farbe ändert und speichert somit die Originale, ändert die Farben und ändert sie wieder auf das Original.
Ich habe auch versucht, die native SetConsoleTextAttribute-Methode durch pinvoke seit der Verwendung von ILSpy, es schien wie die Console.xxx-Methoden waren eine Menge extra Mist, aber ich habe etwa die gleichen Timings.
Das Ändern einer Eigenschaft in der Konsole (oder das Ausführen der meisten Aufgaben mit der Konsole) beinhaltet P/Aufrufen des Konsolenprozesses. Es würde Sinn machen, dass dies einen nicht-trivialen Overhead mit sich bringt. – Abion47
@ Abion47 Ich hatte Zeiten, in denen Pinvoke schneller ist als das Aufrufen der C# -Wrapper, weil sie eine Menge Dinge tun, um kugelsicherer zu sein, während man mit dem direkten Pinvoke-Aufruf all das umgehen kann. Die C# -Wrapper sind wahrscheinlich ein paar hundert Zeilen Code :). Scheint so, als ob das Ändern einer Textfarbe in der Konsole trivial sein sollte. – SledgeHammer
Verwenden Sie 'DateTime' nicht für Zeitberechnungen - verwenden Sie' Stoppuhr'. –