3 回答
TA贡献1878条经验 获得超4个赞
到目前为止,我们有三种竞争方案可供选择:
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
引起了明显的闪烁,我没有观察到任何一种替代方案。因此,道德是尽可能使用退格或回车,并感谢教我一个更快的方法来做到这一点,所以!
更新:在评论中,Joel建议SetCursorPosition相对于移动的距离是恒定的,而其他方法是线性的。进一步的测试证实了这种情况,然而恒定的时间和缓慢仍然很慢。在我的测试中,将一长串退格写入控制台比SetCursorPosition更快,直到大约60个字符。因此,退格会更快地替换短于60个字符(或左右)的部分行,并且它不会闪烁,所以我将支持我最初认可的\ b over \ r \ n和SetCursorPosition
。
- 3 回答
- 0 关注
- 908 浏览
添加回答
举报