Console.Writeline 对性能的影响

Posted

技术标签:

【中文标题】Console.Writeline 对性能的影响【英文标题】:Console.Writeline Effect on Performance 【发布时间】:2013-08-30 03:57:36 【问题描述】:

我有一个有 4 个线程的应用程序。每个线程实际上是一个 Timer 并在特定的时间间隔内执行单独的工作。 这些线程使用Console.Writeline 显示它们的日志。 性能在此应用程序中非常重要。我想知道删除Console.Writeline 是否会调整此应用程序的性能?

【问题讨论】:

每一个未执行的代码都会提高性能。它是否重要是另一个问题——如果没有更多细节就无法回答。比如你的定时器在哪个时间间隔内触发,它们实际做了哪些其他工作(这可能会使Console.WriteLine 语句完全相形见绌),以及它们已经被其他代码(隐式)同步了多少。 其实是为了监控而不是调试 看看控制台如何成为四个线程之间的共享资源,每当一个线程写入它时,其他线程将不得不等到它完成。 (除了 IO 的影响之外。)也就是说,这在很大程度上取决于您记录错误消息的频率与花在有用处的时间成正比。 轶事地说,我已经看到 log4net 语句在分析器日志中显示为有些重要。我可以看到 Console.Writeline 是相似的。具体来说,如果将 string.Format(....) 放在 Writeline 语句中,使用可能会开始变得很重要。 @Pooya 这些都不适用于您的情况,因为视情况而定。就像,如果你记录了很多东西,并且不能记录更少的东西,那么尝试一个记录较少废话但需要吞吐量超过记录准确性的人建议的解决方案实际上是一个糟糕的主意。如果您记录静态输出或大量使用string.Format(),也会有所不同,因为负载在 CPU 和 IO 之间转移。 【参考方案1】:

Console.WriteLine 在性能方面可能存在两个问题:

    IO 通常不是“快速”操作。

    对 WriteLine 的调用是同步的,即如果两个线程要写入,其中一个线程会阻塞在 WriteLine 上,等待另一个线程完成写入。 来自MSDN on console:

使用这些流的 I/O 操作是同步的,这意味着 多个线程可以读取或写入流。

也就是说,了解在 Console.WriteLine 上花费的时间是否会影响特定应用程序的性能的唯一方法是对其进行分析。否则就是过早的优化。

【讨论】:

【参考方案2】:

是的,执行 Console.WriteLine 需要相当长的时间。

删除 Console.WriteLine 调用或将其更改为写入数据的缓冲后台线程将真正加快应用程序的速度。

但是,您的里程可能会因使用的操作系统而异。

【讨论】:

在后台线程上排队的唯一问题是日志记录不再准确,线程可能已经完成,但日志记录仍会写入控制台。 @JeroenvanLangen 这不是唯一的问题。您必须考虑日志记录线程的优先级。如果它高于工作线程,那根本没有帮助。如果它低于工作线程,则缓冲区可能会超出界限并且您的应用程序将耗尽内存,或者线程可能最终在固定容量的缓冲区上等待。从本质上讲,要使其正常工作,您必须确定应用程序有足够的“停机时间”来写出缓冲的日志输出。【参考方案3】:

如果是出于调试目的,您应该使用:Debug.WriteLine(..),因为这些不包含在发布版本中。

【讨论】:

我不明白这如何回答 OP 的问题。您可能还想从应用程序的发布版本中收集日志记录输出,但无论如何,日志记录的目的并不重要。 可以使用 Trace.WriteLine,见***.com/questions/179868/trace-vs-debug-in-net-bcl

以上是关于Console.Writeline 对性能的影响的主要内容,如果未能解决你的问题,请参考以下文章

Console.WriteLine()函数中{}输出格式详解(C#)

C#中的format和console.writeline有啥区别

C#基础第三天-作业答案-集合-冒泡排序-模拟名片

Debug.WriteLine() 与 Console.WriteLine() 处理文化的方式不同。为啥?

Console.WriteLine() 在发布期间写入啥? [复制]

在 Console.WriteLine 上使用三元运算符