powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Скорость цикла и проекция
7 сообщений из 7, страница 1 из 1
Скорость цикла и проекция
    #39890768
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За счет чего цикл с хелпером на столько более тормозной?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
   public static class Helpers
    {
        public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> source)
        {
            return source.Select((item, index) => (item, index));
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            Stopwatch sw = new Stopwatch();
            string testItem = "";
            int index = 0;
            var list = new List<string>();
            for (int j = 0; j < 10000000; j++)
            {
                list.Add("1");
            }

         
            sw.Start();
            int i = 0;
            foreach (var item in list)
            {
                testItem = item;
                index = i++;
            }
            sw.Stop();
            var res = sw.ElapsedMilliseconds;
            sw.Reset();


            sw.Start();
            foreach (var (item, j) in list.WithIndex())
            {
                testItem = item;
                index = i;
            }
            sw.Stop();
            var res2 = sw.ElapsedMilliseconds;
            sw.Reset();


            Console.WriteLine("res 1 " + res + ", res 2 " + res2);
            Console.ReadKey();
        }
    }

...
Рейтинг: 0 / 0
Скорость цикла и проекция
    #39890793
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в первом случае есть переменная индексатор и обращение к массиву идет по индексу элемента в этом массив
а во втором случае используется итератор для перебора всех значений, принцип работы которого совершенно иной.
...
Рейтинг: 0 / 0
Скорость цикла и проекция
    #39890870
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хелпер вызывает метод Enumerable.Select, все перегрузки которого вызывают вот этот метод с yield return в теле цикла. yield return приводит к тому, что на уровне IL создаётся отдельный класс-итератор. Далее, каждая перегрузка Enumerable.Select принимает одним из аргументов делегат, который опять же на уровне IL компилируется в отдельный анонимный класс. Итого, мы как минимум получаем два callvirt - на экземпляре итератора, и на экземпляре класса делегата. При большом количестве элементов коллекции это выливается в ощутимые накладные расходы. Ну, а в приведенном примере еще и создается отдельный тип (опять же в IL) для System.ValueTuple<T, T1>, создаются его экземпляры (на стеке), итд итп.
Даже перебор результата вот такого метода-хелпера уже отрабатывает раза в 2 дольше, чем просто перебор исходного листа:
Код: c#
1.
2.
public static IEnumerable<T> Select2<T>(this IEnumerable<T> source)
  => source.Select(t => t);
...
Рейтинг: 0 / 0
Скорость цикла и проекция
    #39890953
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

Понял, спасибо.
Вообщем yield return там, зря компилятор не оптимизирует, ведь количество известно.
...
Рейтинг: 0 / 0
Скорость цикла и проекция
    #39890955
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
Скорость цикла и проекция
    #39891367
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
Вообщем yield return там, зря компилятор не оптимизирует, ведь количество известно.


при чём тут количество? метод расширения Select по спеке ленивый
...
Рейтинг: 0 / 0
Скорость цикла и проекция
    #39891517
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Hexag0v
Вообщем yield return там, зря компилятор не оптимизирует, ведь количество известно.


при чём тут количество? метод расширения Select по спеке ленивый


В принципе да, выбирать метод перебора должен программист.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Скорость цикла и проекция
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]