哪个更快,for循环或LINQ

时间:2013-12-15 12:47:58

标签: c# linq loops collections

我有两个双重值列表,与此处相同:

 List<double> list1 = something;
 List<double> list2 = somethingElse;

我想减去这两个列表。列表很大,我希望尽快完成。以下哪种方法更快:

public double CalculateDistance(List<double> list1, List<double> list2)
{
    double dist = 0;
    for (int i = 0; i != list1.Count; i++)
    {
        dist += Math.Pow(list1 [i] - list2 [i], 2.0);
    }
    return dist;
}

或者这个:

public double CalculateDistance(List<double> list1, List<double> list2)
{
    double dist = list1.Zip(list2, (v1, v2) => Math.Pow(v1 - v2, 2.0)).Sum();
    return dist;
}

我不知道LINQ在幕后做了什么,所以我不确定哪一个更好。

1 个答案:

答案 0 :(得分:3)

都不是。使用循环比LINQ具有更少的开销,因此这是一个良好的开端。

在循环条件中使用<运算符,这是编写这样一个循环的标准方法,因此编译器更有可能识别它并对其进行正确优化。

使用Math.Pow对数字求平方无效。它在球场中的某个位置比自己繁殖快100倍:

public double CalculateDistance(List<double> list1, List<double> list2) {
  double dist = 0;
  for (int i = 0; i < list1.Count; i++) {
    double n = list1[i] - list2[i];
    dist += n * n;
  }
  return dist;
}

编辑:

使用PLINQ可以获得更好的大型套装性能。在我的计算机上测试我发现使用少于10000个项目使用PLINQ并不快。对于包含1000万个项目的列表,我的执行时间缩短了大约40%。

我还发现使用投影我的执行时间比使用Zip的时间短30%:

public double CalculateDistance(List<double> list1, List<double> list2) {
  return
    ParallelEnumerable.Range(0, list1.Count).Select(i => {
      double n = list1[i] - list2[i];
      return n * n;
    }).Sum();
}