Console.WriteLine会加速我的代码吗?

6

我一直在研究如何加速我的应用程序,因为它对性能至关重要...即每毫秒的提升都有益。为了做到这一点,我有一个方法调用其他方法,而这些其他方法都被包裹在一个Stopwatch计时器和Console.WriteLine调用中。例如:

private void SomeMainMethod()
{
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    SomeMethod();
    sw.Stop();
    Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();
    SomeOtherMethod();
    sw.Stop();
    Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds);

    //...
}
问题是当我注释掉 Stopwatch Console.WriteLine 行时,代码运行慢了约20ms(不是50ms),这对我所需的性能来说很多。 有人知道为什么吗? 编辑:类中的 SomeMainMethod 方法和其他方法也类似于上述被包裹在 Stopwatch Console.WriteLine 调用中。 SomeMainMethod 及其调用的方法是属于一个类的一部分,该类是一个Class Library,从控制台测试平台调用,所有内容都是单线程。 更多信息:应用正在以x86 .NET 4.6.1 Release模式运行,并启用优化。 我也在Visual Studio 2013中运行此操作。

1
那听起来确实很奇怪...我不能说我注意到了这样的速度变化。 - BugFinder
1
如果您没有使用计时器,那么您就“没有以相同的方式测量时间”。您考虑过这一点吗? - stuartd
1
@stuartd 但他的意思是通过移除秒表和显示器,程序会变得更慢,而不是更快?因此代码量会减少。 - BugFinder
1
你是使用附加调试器(F5)还是分离调试器(Ctrl + F5)运行代码? - Bruno Costa
显示剩余7条评论
1个回答

2
阅读了一个没有答案的非常相似的问题后,我可能已经找到了问题所在。在评论部分,一位用户(ForguesR)发表了以下评论:

这真的是一个大猜测:也许因为你正在向IO写入,你的线程会获得更多的处理器时间,因为WriteLine是同步的,从而阻塞其他线程。

所以我想检查一下是否确实如此,所以我将SomeMainMethod更改为以下内容: 注意:通常不建议玩弄线程优先级,这只是测试理论的一种解决方法。我强烈建议在生产代码中不要这样做,除非您100%确定自己知道在做什么,然后可能还是远离它。
private void SomeMainMethod()
{
    System.Threading.ThreadPriority tp = System.Threading.ThreadPriority.Normal;
    try
    {
        tp = System.Threading.Thread.CurrentThread.Priority;

        System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;

        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        SomeMethod();
        sw.Stop();
        Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds);

        sw.Reset();
        sw.Start();
        SomeOtherMethod();
        sw.Stop();
        Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds);

        //...
    }
    finally
    {
        System.Threading.Thread.CurrentThread.Priority = tp;
    }
}
经过这个改变,当注释掉ConsoleStopwatch这两行代码时,我的代码现在运行速度更加稳定快速(约10毫秒)。因此,我相信他的评论在我的情况下可能是正确的。

有趣的是,如果你执行SomeMethod一百次会怎样。我猜 CPU 节流实际上是罪魁祸首(似乎通过 Console.Write 得到了治愈)。你的电脑在高性能模式下吗?平衡模式需要一秒钟才能“启动”,并且也无法达到完全的加速状态。你说10毫秒对你来说是相当重要的时间,但是如果代码在较慢的电脑上运行,10毫秒很容易就会被耗费掉。 - Patrick
@Patrick 我的电脑太差了,所以这段代码不应该在任何更糟糕的设备上运行。而且我已经多次运行了这段代码而没有重启。 - TheLethalCoder

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