Até agora, temos três alternativas concorrentes para fazer isso:
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
}
Eu sempre usei Console.CursorLeft = 0
uma variação na terceira opção, então decidi fazer alguns testes. Aqui está o código que eu usei:
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 minha máquina, obtenho os seguintes resultados:
- Backspaces: 25,0 segundos
- Devoluções de carro: 28,7 segundos
- SetCursorPosition: 49,7 segundos
Além disso, SetCursorPosition
causou cintilação notável que eu não observei com nenhuma das alternativas. Portanto, a moral é usar backspaces ou retornos de carro quando possível , e obrigado por me ensinar uma maneira mais rápida de fazer isso, ASSIM!
Atualização : nos comentários, Joel sugere que SetCursorPosition seja constante em relação à distância movida enquanto os outros métodos são lineares. Testes adicionais confirmam que esse é o caso, porém o tempo constante e lento ainda são lentos. Nos meus testes, gravar uma longa seqüência de backspaces no console é mais rápido que o SetCursorPosition até cerca de 60 caracteres. Portanto, o backspace é mais rápido para substituir partes da linha com menos de 60 caracteres (mais ou menos), e não pisca, por isso vou defender meu endosso inicial de \ b over \ re e SetCursorPosition
.