C# 控制台。写入线对性能的影响

C# 控制台。写入线对性能的影响,c#,multithreading,C#,Multithreading,我有一个应用程序,它有4个线程。每个线程实际上都是一个计时器,在特定的时间间隔内执行单独的任务。 这些线程通过使用Console.Writeline显示其日志。 在这种应用中,性能非常重要。我想知道删除Console.Writeline是否会调整此应用程序的性能?如果出于调试目的,您应该使用:Debug.Writeline,因为这些未包含在发布版本中。是的,执行Console.Writeline需要相当长的时间 删除Console.WriteLine调用或将其更改为写入数据的缓冲后台线程将真正加

我有一个应用程序,它有4个线程。每个线程实际上都是一个计时器,在特定的时间间隔内执行单独的任务。 这些线程通过使用
Console.Writeline
显示其日志。
在这种应用中,性能非常重要。我想知道删除Console.Writeline是否会调整此应用程序的性能?

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

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

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


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

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

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

  • 对WriteLine的调用是同步的,即,如果两个线程想要写入,其中一个线程会阻塞WriteLine,等待另一个线程完成写入。 发件人:

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


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

    每一个未执行的代码都会提高性能。这是否重要是另一个问题——如果没有更多细节,就无法回答。例如,计时器在哪个时间间隔内启动,它们实际执行的其他工作(这可能会使
    控制台.WriteLine
    语句相形见绌),以及它们已经被其他代码同步(隐式)了多少。实际上,它是用于监视而不是调试控制台是四个线程之间的共享资源,每当一个线程向其写入时,其他线程将不得不等待,直到它完成。这在很大程度上取决于您记录错误消息的频率与执行有用操作所花费的时间的比例。从轶事的角度讲,我看到log4net语句在探查器日志中显示得有些重要。我可以看到控制台。Writeline是类似的。具体来说,如果将
    string.Format(..)
    放在Writeline语句中,那么使用
    string.Format(..)
    可能会变得非常重要。@Pooya这一切都不适用于您的情况,视情况而定。比如,如果你记录了很多东西,但不能记录更少的东西,那么尝试一个由那些记录更少垃圾但需要吞吐量超过记录准确性的人建议的解决方案实际上是个糟糕的主意。当CPU和IO之间的负载转移时,如果记录静态输出或大量使用
    string.Format()
    ,也会有区别。我看不出这如何回答OP的问题。您可能还想从应用程序的发布版本收集日志输出,但无论如何,这与日志记录的目的无关。您可以使用Trace.WriteLine,请看,在后台线程上排队的唯一问题是日志记录不再准确,线程可能已经完成,而且日志仍然被写入控制台。@JeroenvanLangen这不是唯一的问题。你必须考虑日志线程的优先级。如果它比工作线程高,那就毫无帮助了。如果低于工作线程,则缓冲区可能会超出范围,应用程序的内存可能会耗尽,或者线程可能最终会等待固定容量的缓冲区。从本质上讲,要使其工作,您必须确定应用程序有足够的“停机时间”来写出缓冲日志输出。