日期:2014-05-18  浏览次数:20752 次

C#并行程序,并行一段时间之后并行度下降
下面是我的一段并行的程序,GraphAdjacentMatrix是并行体之外的一个公共变量,这个程序运行一段时间后并行度会下降,程序执行速度变慢,几乎成了串行程序。求各位解答~~~

Parallel.For(0, NodesCount, (i, LoopState) =>
  {
  Console.WriteLine(i);
  double sumweight = CollumnWeightSum[i];
  foreach (var value in EdgeAndWeightDic[i])
  {
  int row = Convert.ToInt32(value[0]);
  double weight = Convert.ToDouble(value[1]);
  weight = weight / sumweight;

  lock (privateObjectLock)
  {
  GraphAdjacentMatrix[row, i] = weight;
  }

  }
  });

------解决方案--------------------
你这段程序根本就不适合用并行,你在循环内部使用lock,这个操作变得频繁后,使得并行操作毫无意义。
------解决方案--------------------
如果你用到了数组,就应该是定长的,否则应该使用List,对于你这里的二维则是List<List<T>>.
不过如果第一纬度是确定的,也就是你的NodesCount固定,那么也可以用数组加List的组合——List<T>[NodesCount]
------解决方案--------------------
探讨
引用:

拿空间换时间这个办法不为过吧。你那数组会很庞大么?


很大。。。double型的,行列都在10W以上