Sejauh ini kami memiliki tiga alternatif yang bersaing untuk bagaimana melakukan ini:
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
}
Saya selalu menggunakan Console.CursorLeft = 0
, variasi pada opsi ketiga, jadi saya memutuskan untuk melakukan beberapa tes. Berikut kode yang saya gunakan:
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);
}
Di mesin saya, saya mendapatkan hasil berikut:
- Spasi mundur: 25,0 detik
- Pengembalian Carriage: 28,7 detik
- SetCursorPosition: 49,7 detik
Selain itu, SetCursorPosition
menyebabkan kedipan terlihat yang tidak saya amati dengan salah satu alternatif. Jadi, moralnya adalah menggunakan backspaces atau carriage return jika memungkinkan , dan terima kasih telah mengajari saya cara yang lebih cepat untuk melakukan ini, SO!
Pembaruan : Dalam komentar, Joel menyarankan bahwa SetCursorPosition konstan terhadap jarak yang dipindahkan sementara metode lainnya linier. Pengujian lebih lanjut menegaskan bahwa ini adalah kasusnya, namun waktu yang konstan dan lambat masih lambat. Dalam pengujian saya, menulis string panjang spasi mundur ke konsol lebih cepat daripada SetCursorPosition hingga sekitar 60 karakter. Jadi backspace lebih cepat untuk mengganti bagian dari garis yang lebih pendek dari 60 karakter (atau lebih), dan itu tidak berkedip, jadi saya akan mendukung pengesahan awal saya dari \ b over \ r dan SetCursorPosition
.