Console.Writeline对性能的影响

11

我有一个应用程序,有4个线程。每个线程实际上都是一个计时器,在特定的时间间隔内执行不同的工作任务。 这些线程使用Console.Writeline来显示它们的日志。 性能对于这个应用程序非常重要。我想知道是否删除Console.Writeline将会提高此应用程序的性能。


5
未被执行的代码会提高性能。这是否显著取决于更多细节,比如计时器触发的间隔、它们实际执行的其他任务(可能完全压过 Console.WriteLine 语句),以及其他代码对其的隐式同步程度。 - Christian.K
实际上它是用来监控而不是调试。 - Pooya Yazdani
3
由于控制台是四个线程之间共享的资源,因此当一个线程在写入时,其他线程将不得不等待直到它完成(这还加上了IO本身的影响)。话虽如此,这在很大程度上取决于你记录错误消息的频率与执行实用操作所花费时间的比例。 - millimoose
2
就我的经验而言,我曾看到log4net语句在分析器日志中显示为相当重要。我认为Console.Writeline也是类似的情况。具体来说,如果将string.Format(....)放在Writeline语句中使用,可能会开始变得重要。 - chollida
2
@Pooya 对于你的情况,这些都不适用,因为它取决于具体情况。比如,如果你正在记录大量内容,并且无法减少记录量,那么尝试其他人建议的解决方案可能是一个糟糕的主意,因为他们记录的垃圾较少,但需要吞吐量高于记录精度。如果你记录静态输出或者频繁使用string.Format(),负载会在CPU和IO之间转移,也会有所不同。 - millimoose
显示剩余4条评论
3个回答

10

是的,执行Console.WriteLine需要花费可测量的时间。

移除Console.WriteLine调用或更改为在后台缓冲线程中写入数据可以真正加速应用程序。

但是,这取决于使用的操作系统而有所不同。


将其排队到后台线程的唯一问题是日志记录不再准确,线程可能已经完成,但日志仍然写入控制台。 - Jeroen van Langen
@JeroenvanLangen 这绝不是唯一的问题。您必须考虑记录线程的优先级。如果它比工作线程更高,那么它根本不会有所帮助。如果它比工作线程低,那么缓冲区可能会增长到越界并且应用程序将耗尽内存,或者线程可能最终等待固定容量的缓冲区。基本上,为了使这个工作正常,您必须确信该应用程序有足够的“停机时间”来写出缓冲的日志输出。 - millimoose

9

关于Console.WriteLine,可能有两个与性能相关的问题:

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

  2. 调用WriteLine是同步的,即如果两个线程想要写入,其中一个会在WriteLine上阻塞,等待另一个完成写入。根据console的MSDN文档:

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

话虽如此,了解Console.WriteLine花费的时间是否对您特定应用程序的性能产生影响,唯一的方法是进行分析。否则,这是过早优化。


6

如果是为了调试目的,你应该使用:Debug.WriteLine(..),因为这些不会包括在发布版本中。


2
我不认为这回答了楼主的问题。你可能还想从应用程序的发布版本中收集日志输出,而且无论如何,记录的目的是什么都不重要。 - millimoose
1
您可以使用 Trace.WriteLine,参见 https://dev59.com/TXVC5IYBdhLWcg3wz0h9 - Jakub Pawlinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接