Do tej pory mamy trzy konkurujące ze sobą alternatywy:
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
}
Zawsze używałem Console.CursorLeft = 0
, wariant trzeciej opcji, więc postanowiłem zrobić kilka testów. Oto kod, którego użyłem:
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);
}
Na moim komputerze otrzymuję następujące wyniki:
- Przestrzenie tylne: 25,0 sekundy
- Powroty karetki: 28,7 sekundy
- SetCursorPosition: 49,7 sekundy
Dodatkowo SetCursorPosition
spowodowało zauważalne migotanie, którego nie zaobserwowałem dla żadnej z alternatyw. Morał polega na tym, aby w miarę możliwości korzystać z odstępów lub zwrotów karetki , a dzięki za nauczenie mnie szybszego sposobu na to, SO!
Aktualizacja : W komentarzach Joel sugeruje, że SetCursorPosition jest stały w odniesieniu do odległości przesuniętej, podczas gdy inne metody są liniowe. Dalsze testy potwierdzają, że tak jest, jednak stały czas i powolność są wciąż powolne. W moich testach pisanie długiego ciągu odstępów w konsoli jest szybsze niż SetCursorPosition, aż osiągnie około 60 znaków. Tak więc backspace jest szybszy do zastępowania części linii krótszych niż 60 znaków (lub mniej więcej) i nie miga, więc zamierzam podtrzymać moje wstępne poparcie \ b nad \ r i SetCursorPosition
.