Şimdiye kadar bunun nasıl yapılacağı konusunda üç rakip alternatifimiz var:
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
}
Her zaman kullandım Console.CursorLeft = 0
, üçüncü seçenekte bir varyasyon, bu yüzden bazı testler yapmaya karar verdim. İşte kullandığım kod:
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);
}
Makinemde aşağıdaki sonuçları elde ediyorum:
- Arka boşluklar: 25.0 saniye
- Satır Başı: 28,7 saniye
- SetCursorPosition: 49.7 saniye
Ayrıca, SetCursorPosition
her iki alternatifle de gözlemlemediğim gözle görülür titremeye neden oldu. Bu nedenle, ahlaki mümkün olduğunda arka boşluklar veya satır başı kullanmaktır ve bana bunu yapmanın daha hızlı bir yolunu öğrettiğiniz için teşekkürler , SO!
Güncelleme : Yorumlarda Joel, SetCursorPosition'ın diğer yöntemler doğrusal iken taşınan mesafeye göre sabit olduğunu önermektedir. Daha ileri testler bunun doğru olduğunu teyit eder, ancak sabit zaman ve yavaş hala yavaştır. Testlerimde, konsola uzun bir arka boşluk dizesi yazmak, 60 karakter civarında bir yere kadar SetCursorPosition'dan daha hızlıdır. Bu nedenle geri silme, satırın 60 karakterden kısa bölümlerini değiştirmek için daha hızlıdır ve titremez, bu yüzden \ r over \ r ve üzerindeki ilk onayımla duracağım SetCursorPosition
.