Cho đến nay chúng ta có ba lựa chọn thay thế cạnh tranh để làm điều này:
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
}
Tôi đã luôn sử dụng Console.CursorLeft = 0
, một biến thể của tùy chọn thứ ba, vì vậy tôi quyết định thực hiện một số thử nghiệm. Đây là mã tôi đã sử dụng:
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);
}
Trên máy của tôi, tôi nhận được các kết quả sau:
- Không gian sau: 25,0 giây
- Vận chuyển trở lại: 28,7 giây
- SetCthonP vị trí: 49,7 giây
Ngoài ra, SetCursorPosition
gây ra nhấp nháy đáng chú ý mà tôi đã không quan sát với một trong những lựa chọn thay thế. Vì vậy, đạo đức là sử dụng các khoảng trống hoặc trả lại xe khi có thể , và cảm ơn vì đã dạy tôi một cách nhanh hơn để làm điều này, SO!
Cập nhật : Trong các bình luận, Joel gợi ý rằng SetCthonPocation không đổi đối với khoảng cách di chuyển trong khi các phương thức khác là tuyến tính. Thử nghiệm thêm xác nhận rằng đây là trường hợp, tuy nhiên thời gian liên tục và chậm vẫn chậm. Trong các thử nghiệm của tôi, việc viết một chuỗi dài các khoảng trống vào bảng điều khiển nhanh hơn SetC bổngPocation cho đến khoảng 60 ký tự. Vì vậy, backspace nhanh hơn để thay thế các phần của dòng ngắn hơn 60 ký tự (hoặc hơn) và nó không nhấp nháy, vì vậy tôi sẽ đứng trước sự chứng thực ban đầu của tôi về \ b trên \ r và SetCursorPosition
.