Finora abbiamo tre alternative in competizione per come fare questo:
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
}
Ho sempre usato Console.CursorLeft = 0
una variante della terza opzione, quindi ho deciso di fare alcuni test. Ecco il codice che ho usato:
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);
}
Sulla mia macchina, ottengo i seguenti risultati:
- Spazi posteriori: 25,0 secondi
- Ritorni a capo : 28,7 secondi
- SetCursorPosition: 49.7 secondi
Inoltre, ha SetCursorPosition
causato uno sfarfallio evidente che non ho osservato con nessuna delle alternative. Quindi, la morale è usare backspaces o ritorni a capo quando possibile , e grazie per avermi insegnato un modo più veloce per farlo, SO!
Aggiornamento : nei commenti, Joel suggerisce che SetCursorPosition è costante rispetto alla distanza spostata mentre gli altri metodi sono lineari. Ulteriori test confermano che questo è il caso, tuttavia il tempo costante e lento è ancora lento. Nei miei test, scrivere una lunga serie di backspaces sulla console è più veloce di SetCursorPosition fino a circa 60 caratteri. Quindi il backspace è più veloce per la sostituzione di parti della riga più corte di 60 caratteri (o giù di lì), e non lampeggia, quindi sopporterò il mio avallo iniziale di \ b su \ r e SetCursorPosition
.