当并行代码在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内部运行代码的自动化测试没有这个限制。控制台应用程序显示为节流,而自动测试没有。
我比较了Thread
和ProcessThread
之间的设置,它们似乎是等效的。它们使用相同的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;
}
}
}
});
//...
}
也许TaskScheduler是不同的?尝试检查System.Threading.Tasks.TaskScheduler。当前属性(来自任务上下文中)
我终于找到了解决问题的办法。设置一个App.config文件,将gcServer设置为true,解决了我们的问题。我们的应用程序是如此的实例化繁重,以致于垃圾收集器影响了性能。我猜Visual Studio在运行单元测试时使用的垃圾收集器是不同的?将来,我们还将致力于最小化GC的使用。