Jusqu'à présent, nous avons trois alternatives concurrentes sur la façon de procéder:
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
}
J'ai toujours utilisé Console.CursorLeft = 0
une variante de la troisième option, j'ai donc décidé de faire quelques tests. Voici le code que j'ai utilisé:
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);
}
Sur ma machine, j'obtiens les résultats suivants:
- Espaces arrière: 25,0 secondes
- Retours chariot: 28,7 secondes
- SetCursorPosition: 49,7 secondes
De plus, cela a SetCursorPosition
provoqué un scintillement notable que je n'ai observé avec aucune des alternatives. Donc, la morale est d' utiliser des backspaces ou des retours chariot lorsque cela est possible , et merci de m'avoir enseigné un moyen plus rapide de le faire, SO!
Mise à jour : dans les commentaires, Joel suggère que SetCursorPosition est constant par rapport à la distance parcourue alors que les autres méthodes sont linéaires. Des tests supplémentaires confirment que c'est le cas, mais le temps constant et lent est toujours lent. Dans mes tests, l'écriture d'une longue chaîne d'espaces arrière sur la console est plus rapide que SetCursorPosition jusqu'à environ 60 caractères. Ainsi, le retour arrière est plus rapide pour remplacer des parties de la ligne de moins de 60 caractères (ou plus), et il ne scintille pas, donc je vais m'en tenir à mon approbation initiale de \ b sur \ r et SetCursorPosition
.