在某些背景下,我正在尝试进行大规模的建筑仿真。

问题是我要在其上执行快速数组乘法的自定义类型Point3D的列表。因此,在每个不同的时间步长,我将不得不为每个doublePoint3D值乘以Point3D(我已经重载了Point3D的乘法和除法运算),然后结果将是存储在Dictionary<double,List<Point3D>>中。该词典的关键是不同的时间步长,其值是相应的位移。

由于我有很多自由度,并且需要很多时间,因此上述操作似乎很慢。是否有优化整个操作的方法?

这是我当前的代码,非常慢。所以我需要一些想法来优化它。

public static Dictionary<double, List<Point3D>> ComputeTimeSeries(Dictionary<double, double> timeStep, List<Point3D> dofs)
{
   var timeSeries = new Dictionary<double, List<Point3D>>();
   foreach(var keyValue in timeStep)
   {
      // the point3d*double operation is already being overloaded.
      timeSeries.Add(keyValue.Key, dofs.Select(pt=>pt*keyValue.Value).ToList());
   }
   return timeSeries;
}


注意:我目前仍然停留在.Net 3.5。因此,PLINQ和TPL可能无济于事

最佳答案

我会尝试这样的事情:

public static Dictionary<double, Point3D[]> ComputeTimeSeries(Dictionary<double,    double> timeStep, Point3D[] dofs)
{
   var timeSeries = new Dictionary<double, Point3D[]>();
   foreach(var keyValue in timeStep)
   {
      var tempArray = new Point3D[dofs.Length];
      for (int index=0; index < dofs.Length; index++)
          tempArray[index] = dofs[index] * keyValue.Value;
      timeSeries.Add(keyValue.Key, tempArray);
   }
   return timeSeries;
}


使用Select / ToList更具可读性,但是与简单的乘法相比,额外的接口调用非常昂贵。

关于c# - C#中的快速列表乘法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3279936/

10-09 03:45