有没有更快的方法设置控制台颜色?

时间:2017-01-04 00:41:44

标签: c# winapi

正在分析我的代码并发现我们做彩色控制台文本的方式非常昂贵(大部分运行时)。

    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方法做了很多额外的废话,但我得到了相同的时间。

1 个答案:

答案 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行的批次也会将运行时间缩短一半。*如果您因任何原因向控制台发送垃圾邮件,这可能会有很大帮助。

*在我的机器上。