Наразі у нас є три конкуруючих альтернативи, як це зробити:
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
}
Я завжди користувався Console.CursorLeft = 0
варіацією щодо третього варіанту, тому вирішив зробити кілька тестів. Ось код, який я використав:
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);
}
На своїй машині я отримую такі результати:
- Резервна кількість: 25,0 секунди
- Повернення каретки: 28,7 секунди
- SetCursorPosition: 49,7 секунди
Крім того, SetCursorPosition
викликав помітний мерехтіння, якого я не спостерігав ні з однією з альтернатив. Отже, мораль - використовувати зворотні простори або повернення до перевезення, коли це можливо , і дякую за те, що ви навчили мене більш швидкому способу зробити це, ТАК!
Оновлення : У коментарях Джоел припускає, що SetCursorPosition є постійним щодо відстані, яку переміщують, а інші методи лінійні. Подальше тестування підтверджує, що це так, однак постійний час і повільний все ще повільний. У моїх тестах запис довгих рядків зворотних просторів на консоль швидше, ніж на SetCursorPosition, поки десь близько 60 символів. Таким чином, зворотний простір швидше замінює частини рядка, менші за 60 символів (або близько того), і він не мерехтить, тому я буду стояти біля свого початкового схвалення \ b над \ r і SetCursorPosition
.