如果我有大量列表,有什么方法可以让这个操作运行得更快?
您可以将结果列表创建移动到计数之后:
List<double?> list1 = new List<double?>();
List<double?> list2 = new List<double?>();
int recordCount = list1.Count > list2.Count ? list2.Count : list1.Count;
List<double?> listResult = new List<double?>(recordCount);
这将使您可以指定结果所需的确切容量,并避免在列表本身内重新分配。对于“巨大的列表”,这可能是最慢的部分之一,因为随着列表变大,内存分配和复制将是这里最慢的操作。
此外,如果计算很简单,您可能会使用多个核心:
List<double?> list1 = new List<double?>();
List<double?> list2 = new List<double?>();
int recordCount = list1.Count > list2.Count ? list2.Count : list1.Count;
var results = new double?[recordCount]; // Use an array here
Parallel.For(0, recordCount, index =>
{
double? result = list1[index] + list2[index];
results[index] = result;
});
鉴于“工作”在这里非常简单,您实际上可能需要一个自定义分区器来充分利用并行性(有关详细信息,请参阅如何:加速小型循环体):
var results = new double?[recordCount]; // Use an array here
var rangePartitioner = Partitioner.Create(0, recordCount);
Parallel.ForEach(rangePartitioner, range =>
{
for (int index = range.Item1; index < range.Item2; index++)
{
results[index] = list1[index] + list2[index];
}
});
但是,如果这不是瓶颈,您可以使用 LINQ 单行执行此操作:
var results = list1.Zip(list2, (one, two) => one + two).ToList();
但是,如果性能确实是一个瓶颈,这将(非常轻微地)比自己处理循环效率低。