จนถึงตอนนี้เรามีทางเลือกการแข่งขันสามทางสำหรับวิธีการ:
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);
}
บนเครื่องของฉันฉันได้รับผลลัพธ์ต่อไปนี้:
- Backspaces: 25.0 วินาที
- การคืนรถ: 28.7 วินาที
- SetCursorPosition: 49.7 วินาที
นอกจากนี้ยังSetCursorPosition
ทำให้เกิดการสั่นไหวที่สังเกตเห็นได้ซึ่งฉันไม่ได้สังเกตด้วยทางเลือกใดวิธีหนึ่ง ดังนั้นคุณธรรมคือการใช้ backspaces หรือ carriage return เมื่อเป็นไปได้และขอขอบคุณสำหรับการสอนวิธีที่เร็วกว่านี้ให้ฉันดังนั้น!
อัปเดต : ในความคิดเห็นโจเอลแนะนำว่า SetCursorPosition เป็นค่าคงที่ตามระยะทางที่เคลื่อนที่ในขณะที่วิธีอื่นเป็นแบบเส้นตรง การทดสอบเพิ่มเติมยืนยันว่าเป็นกรณีนี้อย่างไรก็ตามเวลาคงที่และช้ายังคงช้า ในการทดสอบของฉันการเขียนแบ็คสเปซหลังยาวไปยังคอนโซลนั้นเร็วกว่า SetCursorPosition จนกระทั่งมีประมาณ 60 ตัวอักษร ดังนั้น Backspace เร็วเพื่อทดแทนส่วนของเส้นที่สั้นกว่า 60 ตัวอักษร (หรือมากกว่านั้น) และมันไม่ได้สั่นไหวดังนั้นฉันจะยืนตามการรับรองของฉันเริ่มต้นของ \ ขมากกว่า \ r SetCursorPosition
และ