내가 거대한 목록이있는 경우이 작업이 빠르게 실행 할 수 있도록 어떤 방법이 있나요?
당신은 당신의 계산이 끝날 때까지 결과에 대한 목록 작성을 움직일 수 :
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