正在分析我的代码并发现我们做彩色控制台文本的方式非常昂贵(大部分运行时)。
DateTime dt = DateTime.Now;
for (int i = 0; i <= 20000; i++)
{
ConsoleColor cf = Console.ForegroundColor;
ConsoleColor cb = Console.BackgroundColor;
Console.ForegroundColor = ConsoleColor.Red;
Console.BackgroundColor = ConsoleColor.Blue;
Console.WriteLine("Hello World");
Console.ForegroundColor = cf;
Console.BackgroundColor = cb;
}
System.Diagnostics.Debug.WriteLine((DateTime.Now - dt).TotalMilliseconds);
这个简单的循环需要2.8秒才能在我的机器上运行。如果我只做WriteLine,它只有600ms。
现在,在我得到巨魔答案之前 :)问我为什么在硬编码,这是测试代码时,在实际代码,前景和背景颜色是根据几个不同的因素计算出来的。那部分是无关紧要的。此代码只是假设颜色会改变,从而保存原件,更改颜色,然后将其更改回原始颜色。
由于使用了ILSpy,我还尝试通过pinvoke使用原生SetConsoleTextAttribute方法,似乎Console.xxx方法做了很多额外的废话,但我得到了相同的时间。
答案 0 :(得分:2)
不是真的。正如您已经注意到的,Console
内置的属性直接与SetConsoleTextAttribute
交互,这是 在Windows中设置控制台输出属性的方式。
如果ANSI颜色是一个选项,这将是您使用控制台颜色的逻辑的重大更改,它 更快。最小的案例
for (int i = 0; i <= 20000; i++)
{
Console.WriteLine("\x1b[31m\x1b[44mHello World\x1b[39m\x1b[49m");
}
在我的机器上运行大约1200毫秒,而Console.xxxColor
属性运行大约7000毫秒。
您需要兼容的shell。 Ansicon有效。
使用ANSI颜色,您可以额外批量输出,以节省更多时间。即使是20行的批次也会将运行时间缩短一半。*如果您因任何原因向控制台发送垃圾邮件,这可能会有很大帮助。
*在我的机器上。