C# 性能诊断提高了性能
我在Visual Studio 2013中遇到了一个奇怪的异常情况。我正在对我的程序进行性能分析(使用CPU采样),我发现在某些情况下,程序在分析时运行得更快。在需要处理少量数据的情况下,性能分析似乎可以提高程序的性能。该程序使用并行扩展(C#和LINQ)进行并行化 我的假设是,这与并行性和少量数据有关C# 性能诊断提高了性能,c#,performance,linq,visual-studio-2013,performance-testing,C#,Performance,Linq,Visual Studio 2013,Performance Testing,我在Visual Studio 2013中遇到了一个奇怪的异常情况。我正在对我的程序进行性能分析(使用CPU采样),我发现在某些情况下,程序在分析时运行得更快。在需要处理少量数据的情况下,性能分析似乎可以提高程序的性能。该程序使用并行扩展(C#和LINQ)进行并行化 我的假设是,这与并行性和少量数据有关 是否有人发生过这种情况,或者有人能解释原因吗?当您运行探查器时,将不会附加调试器。连接调试器可以防止在运行程序时发生大量优化,这主要是因为在调试过程中可能会丢失您想要知道的信息 下面是一个简单的
是否有人发生过这种情况,或者有人能解释原因吗?当您运行探查器时,将不会附加调试器。连接调试器可以防止在运行程序时发生大量优化,这主要是因为在调试过程中可能会丢失您想要知道的信息 下面是一个简单的例子
void SomeFunction()
{
var foo = new SomeTypeThatTakesUp1GBOfRam();
DoSomthingWithFoo(foo);
for(int i = 0; i < 10000; i++)
{
Thread.Sleep(1000);
}
}
void SomeFunction()
{
var foo=newsometypethatakesup1gbofram();
DoSomthingWithFoo(foo);
对于(int i=0;i<10000;i++)
{
睡眠(1000);
}
}
当您附加了调试器时,foo
不能被垃圾收集,直到它超出函数底部的作用域(这将花费相当长的时间)。如果没有附加调试器,foo
将在DoSomthingWithFoo(foo)
返回时有资格进行垃圾收集
它必须等待以收集它的原因是,如果您在for循环的第2000个循环上暂停了调试器,并希望查看
foo
的值,该怎么办?只有当垃圾收集器尚未收集变量时,才能执行此操作。如果未连接调试器,则运行库知道在以后的任何时间点都不会“需要查看”foo
,因此它会将其清除。当调试器运行较慢时,您是否在连接调试器的情况下运行它?确实,这就是原因。我不知道为什么我没有想到这一点。