Bisher haben wir drei konkurrierende Alternativen, um dies zu tun:
Console.Write("\r{0} ", value); // Option 1: carriage return
Console.Write("\b\b\b\b\b{0}", value); // Option 2: backspace
{ // Option 3 in two parts:
Console.SetCursorPosition(0, Console.CursorTop); // - Move cursor
Console.Write(value); // - Rewrite
}
Ich habe immer Console.CursorLeft = 0
eine Variation der dritten Option verwendet, also habe ich beschlossen, einige Tests durchzuführen. Hier ist der Code, den ich verwendet habe:
public static void CursorTest()
{
int testsize = 1000000;
Console.WriteLine("Testing cursor position");
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < testsize; i++)
{
Console.Write("\rCounting: {0} ", i);
}
sw.Stop();
Console.WriteLine("\nTime using \\r: {0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
int top = Console.CursorTop;
for (int i = 0; i < testsize; i++)
{
Console.SetCursorPosition(0, top);
Console.Write("Counting: {0} ", i);
}
sw.Stop();
Console.WriteLine("\nTime using CursorLeft: {0}", sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
Console.Write("Counting: ");
for (int i = 0; i < testsize; i++)
{
Console.Write("\b\b\b\b\b\b\b\b{0,8}", i);
}
sw.Stop();
Console.WriteLine("\nTime using \\b: {0}", sw.ElapsedMilliseconds);
}
Auf meinem Computer erhalte ich folgende Ergebnisse:
- Backspaces: 25,0 Sekunden
- Wagenrücklauf: 28,7 Sekunden
- SetCursorPosition: 49,7 Sekunden
Außerdem SetCursorPosition
verursachte sich ein merkliches Flackern, das ich bei keiner der Alternativen beobachtete. Die Moral ist es also, wenn möglich Backspaces oder Wagenrückläufe zu verwenden , und danke, dass Sie mir einen schnelleren Weg beigebracht haben, SO!
Update : In den Kommentaren schlägt Joel vor, dass SetCursorPosition in Bezug auf die zurückgelegte Strecke konstant ist, während die anderen Methoden linear sind. Weitere Tests bestätigen, dass dies der Fall ist, jedoch ist konstante Zeit und langsam immer noch langsam. In meinen Tests ist das Schreiben einer langen Reihe von Backspaces in die Konsole schneller als bei SetCursorPosition, bis etwa 60 Zeichen erreicht sind. Die Rücktaste ist also schneller, um Teile der Zeile zu ersetzen, die kürzer als 60 Zeichen (oder so) sind, und sie flackert nicht. Daher werde ich zu meiner anfänglichen Bestätigung von \ b über \ r und stehen SetCursorPosition
.