나는 반복하고 계산해야합니다. 가장 빠르거나 선호하는 것은 무엇입니까 : ToArray () 또는 Tolist ()? [복제하다

StackOverflow https://stackoverflow.com/questions/1826658

문제

가능한 복제 :
LINQ 쿼리에서 Tolist () 또는 ToArray ()를 호출하는 것이 더 낫습니까?

다음과 같은 코드가 있습니다.

void Foobar(string[] arr, Dictionary<string, string[]>)
{
   var t = arr.Intersect(dic.Keys).ToList(); // .or ToArray() ?
   foreach(var item in t)
   {
      ..
   }

   var j = t.Count; // also I need this
}

어떤 방법이 선호됩니까?

나는 아무것도없이 갈 수는 있지만 크기를 알아야하는데 전화하고 싶지 않아 Enumerable.Count<T>() - 그러면 더 많은 행동을하는 것 같습니다 Array<T>.Size 또는 List<T>.Count. 내가 맞아?

도움이 되었습니까?

해결책

실제로, 현재 MS MS 구현 (ienumerable)에는 ienumerable이 iCollection이고 전화를 걸면 바로 가기가 있습니다. 따라서 요소를 계산하는 데 성능이 비슷해야합니다.

Tolist와 Toarray는 약간 동일합니다. ienumerable이 iCollection 인 경우, Copyto 메소드가 대신 호출되어 약간 더 빠릅니다.

따라서 코드가 가장 읽기 쉬운 원인을 선택하고 사용 사례에 대한 벤치 마크를 선택하여 명확한 답을 얻으십시오.

업데이트 : 순진한 벤치 마크를했습니다.

배열로 시작 : var items = Enumerable.Range(1,1000).ToArray();

  • Tolist () 호출 : 25ms / 10000
  • ToArray () 호출 : 23ms / 10000

ienumerable부터 시작 : var items = Enumerable.Range(1,1000);

  • Tolist () 호출 : 168ms / 10000
  • ToArray () 호출 : 171ms / 10000

따라서 기본적으로 비슷한 성능을 얻습니다.

다른 팁

당신이있는 경우 진짜 성능에 대해 걱정하면, 당신은 반복해야합니다 IEnumerable 그리고 당신이 갈 때 계산하십시오. 이것은 새로운 컬렉션을 완전히 만들지 않아도되며 교차로는 한 번만 반복해야합니다.

void Foobar(string[] arr, Dictionary<string, string[]>)
{
   var t = arr.Intersect(dic.Keys);
   int count = 0;
   foreach(var item in t)
   {
      count++;
      ..
   }

   var j = count;
}

그러나 다른 사람이 말했듯이 : 이것은 미세 최적화의 냄새입니다. 이 상황에서 성능이 실제로 중요하다면, 최소한 성능 프로파일 링을 수행하여 어떤 방법이 실제로 가장 빠른지 알아냅니다.

차이는 아마도 너무 작아서 필요에 맞는 방법을 사용하는 것이 좋습니다. 미세 최적화의 냄새.

그리고이 경우, 당신이하고있는 모든 일이 세트를 열거하고 세트를 계산하는 것 (둘 다 ienumerable으로 할 수있는 세트를 세는 것)이므로 왜 그것을 ienumerable <>으로 남겨 두지 않겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top