Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 性能诊断提高了性能_C#_Performance_Linq_Visual Studio 2013_Performance Testing - Fatal编程技术网

C# 性能诊断提高了性能

C# 性能诊断提高了性能,c#,performance,linq,visual-studio-2013,performance-testing,C#,Performance,Linq,Visual Studio 2013,Performance Testing,我在Visual Studio 2013中遇到了一个奇怪的异常情况。我正在对我的程序进行性能分析(使用CPU采样),我发现在某些情况下,程序在分析时运行得更快。在需要处理少量数据的情况下,性能分析似乎可以提高程序的性能。该程序使用并行扩展(C#和LINQ)进行并行化 我的假设是,这与并行性和少量数据有关 是否有人发生过这种情况,或者有人能解释原因吗?当您运行探查器时,将不会附加调试器。连接调试器可以防止在运行程序时发生大量优化,这主要是因为在调试过程中可能会丢失您想要知道的信息 下面是一个简单的

我在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
,因此它会将其清除。

当调试器运行较慢时,您是否在连接调试器的情况下运行它?确实,这就是原因。我不知道为什么我没有想到这一点。