거기에 더 나은 배열 반복보다 짧은 방법은?
int[] arr = new int[] { 1, 2, 3 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
설명:
더 나은 기본은 더 깨끗한 코드를 의미하지만 성능 향상에 대한 힌트도 환영합니다. (이미 언급했듯이 : 큰 배열 분할).
내가 킬러 성능 향상을 찾고있는 것과는 달랐습니다. 이런 종류의 구문 설탕 이 이미 사용 가능하지 않은지 궁금했습니다 . “String.Join-int []에 대한 도대체 무엇입니까?”
답변
.NET 3.5 (또는 그 이상) 및 LINQ를 사용할 수있는 경우
int sum = arr.Sum();
답변
네, 있습니다. .NET 3.5 사용 :
int sum = arr.Sum();
Console.WriteLine(sum);
.NET 3.5를 사용하지 않는 경우 다음을 수행 할 수 있습니다.
int sum = 0;
Array.ForEach(arr, delegate(int i) { sum += i; });
Console.WriteLine(sum);
답변
LINQ 사용 :
arr.Sum()
답변
어떻게 더 잘 정의 하느냐에 달려 있습니다. 코드가 더 깔끔해 보이기를 원한다면 다른 답변에서 언급했듯이 .Sum ()을 사용할 수 있습니다. 작업이 빠르게 실행되기를 원하고 큰 배열이있는 경우 하위 합계로 나누고 결과를 합산하여 병렬로 만들 수 있습니다.
답변
Aggregate()
확장 방법 을 사용하는 대안도 있습니다 .
var sum = arr.Aggregate((temp, x) => temp+x);
답변
LINQ를 선호하지 않는 경우 인덱스 부족을 방지하기 위해 foreach 루프를 사용하는 것이 좋습니다.
int[] arr = new int[] { 1, 2, 3 };
int sum = 0;
foreach (var item in arr)
{
sum += item;
}
답변
매우 큰 어레이의 경우 하나 이상의 프로세서 / 시스템 코어를 사용하여 계산을 수행하는 데 비용이들 수 있습니다.
long sum = 0;
var options = new ParallelOptions()
{ MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.ForEach(Partitioner.Create(0, arr.Length), options, range =>
{
long localSum = 0;
for (int i = range.Item1; i < range.Item2; i++)
{
localSum += arr[i];
}
Interlocked.Add(ref sum, localSum);
});