有什麼辦法使這個操作運行速度更快,如果我有巨大的名單?
你可以將你的列表創建的結果,直到你開始計數後:
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;
});
鑑於「工作」就是這裏這麼簡單,你可能確實需要自定義分區,以獲得最大的並行性(見How to: Speed Up Small Loop Bodies瞭解詳細信息):
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();
然而,這將是(非常輕微),比處理自己的循環效率較低,如果性能確實是一個瓶頸。
在將它們添加到一起之前,如何填充列表?如果數據來自數據庫,那麼從dB獲得結果總和會更快。 –
您知道如果2個列表具有不同的大小,此代碼將產生ArrayOutOfBoundsException? –
@juergend不,他首先發現哪個列表更短 - 第5行。 – Jay