我一直在研究如何加速我的应用程序,因为它对性能至关重要......即每一毫秒我能摆脱它更好。为此,我有一个调用其他方法的方法,其中每个方法都包含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(而不是50)时,这对我所需要的很多。
有谁知道这是为什么?
修改
SomeMainMethod
方法和该类中的其他方法也包含在与上述类似的Stopwatch
和Console.WriteLine
调用中。
SomeMainMethod
及其调用的方法是类的一部分,该类是从控制台测试平台调用的类库的一部分,所有这些都是单线程的。
有关详细信息:该应用程序在x86 .NET 4.6.1发布模式下运行,并启用了优化。我也是在2013年的visual studio中运行它。
答案 0 :(得分:2)
在阅读了一个非常相似的question没有答案后,我可能已经找到了问题。在评论部分,用户(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;
}
}
进行此更改后,当Console
和Stopwatch
行被注释掉时,我的代码现在可以更快地运行(~10ms)。所以我相信他的评论可能是正确的,至少在我的情况下。