Hasta ahora tenemos tres alternativas competitivas sobre cómo hacer esto:
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
}
Siempre he usado Console.CursorLeft = 0
una variación de la tercera opción, así que decidí hacer algunas pruebas. Aquí está el código que usé:
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);
}
En mi máquina, obtengo los siguientes resultados:
- Espacios traseros: 25.0 segundos
- Devoluciones de carro: 28.7 segundos
- SetCursorPosition: 49.7 segundos
Además, SetCursorPosition
causó un notable parpadeo que no observé con ninguna de las alternativas. Por lo tanto, la moraleja es usar espacios de retroceso o retornos de carro cuando sea posible , y gracias por enseñarme una forma más rápida de hacer esto, ¡SO!
Actualización : en los comentarios, Joel sugiere que SetCursorPosition es constante con respecto a la distancia movida mientras que los otros métodos son lineales. Pruebas adicionales confirman que este es el caso, sin embargo , el tiempo constante y lento aún es lento. En mis pruebas, escribir una larga cadena de espacios de retroceso en la consola es más rápido que SetCursorPosition hasta aproximadamente 60 caracteres. Entonces, el retroceso es más rápido para reemplazar porciones de la línea de menos de 60 caracteres (más o menos), y no parpadea, por lo que voy a mantener mi respaldo inicial de \ b sobre \ r y SetCursorPosition
.