【问题标题】:C# Efficient Skip Console Writeline?C# 高效跳过控制台写行?
【发布时间】:2016-04-23 00:36:48
【问题描述】:

C# .NET exe (4.6.1) 通过调用执行 Console.Writeline 的方法输出大量状态。以至于它明显减慢了执行速度。首先想到的是在被调用的方法中根据值添加一个布尔值和/不执行 Writeline。但是,如果 exe 执行 4000 Writelines 即是 4000 次检查,这似乎过多。

什么是短路输出的好方法?以某种方式将 Console.SetOut 设置为 null 的方法?

谢谢。

【问题讨论】:

  • 我认为bool 与调用Console.Writeline 相比会相当轻松
  • 您肯定不会在发布版本中输出任何内容吗?只需添加编译器指令#if DEBUG
  • 检查bool 比任何形式的访问Console 都要快得多。你有没有真正分析过你的应用程序,看看bool 比较的实际成本是多少?我怀疑不是,否则你不会费心问这个问题。您可能要做的唯一优化是根本不使用所有执行 WriteLine 的方法 - 完全删除它,除非您启用它以进行调试或跟踪。

标签: c# string textwriter


【解决方案1】:

您可以使用委托来解决这个问题,尽管我确信检查布尔值可能比 Console.WriteLine() 快得多。

为类添加一个委托:

public delegate void Output(string message);

然后在应用程序启动时,您可以检查您的布尔值并根据您是否要实际编写来分配要运行的方法。

bool logInformation = true;

if(logInformation)
{
    ProcessInformation((s) => { Console.WriteLine(s); });
}
else
{
    ProcessInformation((s) => { });
}

最后将委托添加到您的处理方法的方法签名中。

private void ProcessInformation(Output logger)
{
    // doing stuff, time to write
    logger("test");
}

你需要用 logger() 替换你的 Console.WriteLine 调用,但这将允许你运行东西而不必担心每次检查布尔值。也就是说,我不知道它是否真的比每次检查 bool 更快,但可能更容易实现和维护。

【讨论】:

    【解决方案2】:

    回答您的确切问题:

    Console.SetOut(TextWriter.Null);
    

    但是 System.Diagnostics TraceEvent 调用让您可以更精细地控制输出内容。例如,在 prod 中您可以只输出“错误”消息,而在开发时您可以输出详细日志。 https://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.traceevent(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2014-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多