Я должен выполнить итерации и рассчитать. Что является самым быстрым или предпочтительным: ToArray () или ToList ()? [дубликат]

Ctrl + я для возрастающего поиска

17
задан Community 23 May 2017 в 11:44
поделиться

3 ответа

Фактически, в текущей реализации MS Count (IEnumerable) есть ярлык, который проверяет, является ли IEnumerable ICollection и вызывает для него Count. Так что производительность при подсчете элементов должна быть сопоставимой.

ToList и ToArray немного похожи. Если IEnumerable - это ICollection, то вместо этого вызывается метод CopyTo, что немного быстрее.

Итак, выберите, что делает ваш код наиболее читаемым, и сравните тест для ВАШЕГО варианта использования, чтобы получить определенный ответ.

Обновить: Я провел наивный тест.

Начиная с массива: var items = Enumerable.Range (1,1000) .ToArray ();

  • вызов ToList (): 25 мс / 10000
  • вызов ToArray ( ): 23 мс / 10000

Начиная с IEnumerable: var items = Enumerable.Range (1,1000);

  • вызов ToList (): 168 мс / 10000
  • вызов ToArray (): 171 мс / 10000

Таким образом, вы получаете сопоставимую производительность.

16
ответ дан 30 November 2019 в 11:32
поделиться

Разница, вероятно, настолько мала, что стоит просто использовать метод, который лучше соответствует вашим потребностям. Пахнет микрооптимизацией.

И в этом случае, поскольку все, что вы делаете, это перечисляет набор и подсчитывает набор (и то, и другое вы можете сделать с IEnumerable), почему бы просто не оставить его как IEnumerable <>?

11
ответ дан 30 November 2019 в 11:32
поделиться

Если вы действительно беспокоитесь о производительности, вам следует перебрать 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;
}

Но, как кто-то сказал: это пахнет микрооптимизацией. Если производительность действительно имеет значение в этой ситуации, по крайней мере выполните профилирование производительности, чтобы выяснить, какой метод действительно самый быстрый для вас.

12
ответ дан 30 November 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: