当并行代码在Visual Studio自动化测试中运行得更快时,应该寻找什么

本文关键字:什么 寻找 运行 代码 并行 Visual Studio 自动化测试 | 更新日期: 2023-09-27 17:51:22

我们有一个c#。. NET 4.0框架)项目的Parallel.For循环在Visual Studio内的自动测试中运行得非常快,但是相同的并行化代码在独立应用程序中不能像预期的那样运行,我们正在试图找出原因。

代码是高内存使用,但我们的工作站(Windows 7 pc)有足够的RAM,所以我不希望有任何内存分页问题。并行循环中没有文件I/O或GUI代码。

在独立版本中,代码在多个线程和内核上运行,但似乎被限制为不超过1个CPU的CPU时间,尽管分支到多个内核上。因此,如果代码顺序地使用1个CPU的100%,那么看起来它将在4个CPU中总共使用25%。

在Visual Studio内部运行代码的自动化测试没有这个限制。控制台应用程序显示为节流,而自动测试没有。

我比较了ThreadProcessThread之间的设置,它们似乎是等效的。它们使用相同的SynchronizationContext (null)和TaskScheduler (Default)。

我也试过用手动创建的Thread s替换Parallel.For,这似乎没有改变任何东西。

我应该寻找什么可能导致Visual Studio中的自动化测试和独立应用程序之间的差异?

下面是一些相关的示例代码:

public void Process(string name)
{
    //...
    Results bestResult = null;
    int best = int.MaxValue;
    Object lockObject = new Object();
    var parent = new Data(this.nameToPart[name]);
    var myParams = new Params(this.params);
    Parallel.For(0, myParams.numRunsPerLvl, (i) =>
    {
        var result = Processor.MultilevelProcessor(parent, myParams);
        if (part.cost < bestCut)
        {
            lock (lockObject)
            {
                if (part.cost < best)
                {
                    best = part.cost;
                    bestResult = result;
                }
            }
        }
    });
    //...
}

当并行代码在Visual Studio自动化测试中运行得更快时,应该寻找什么

也许TaskScheduler是不同的?尝试检查System.Threading.Tasks.TaskScheduler。当前属性(来自任务上下文中)

我终于找到了解决问题的办法。设置一个App.config文件,将gcServer设置为true,解决了我们的问题。我们的应用程序是如此的实例化繁重,以致于垃圾收集器影响了性能。我猜Visual Studio在运行单元测试时使用的垃圾收集器是不同的?将来,我们还将致力于最小化GC的使用。