powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной?
25 сообщений из 72, страница 1 из 3
Почему LINQ такой тормозной?
    #38655788
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Skip(n) is O(n).

Получается, что, если n достаточно велико, то быстрее (по выполнению, а не по написанию) будет страрый добый for сделать, где сразу начать операции с нужного индекса. И с фором будет O(1).

Я понимаю, что LINQ надо использовать только в местах, где скорость не важна. Но всё же не могли бы они его немного ускорить? Ну чтобы хотя бы вот такие вещи, как Skip.

Люди страшные вещи говорят: http://stackoverflow.com/questions/9718117/selecting-first-10-records-then-next-10-paging-using-linq#comment12354639_9718155 .
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655805
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной".
P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ...
P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655817
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
все в природе енумераторов..
прикурите пож. такой пример..
Код: 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.
 class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<int> s = GetInts();
            //foreach (var i in s)
            //{
            //    Console.Write(i);
            //}
            for (int i = 0; i < s.Count(); i++)
            {
                Console.Write(i);
            }

        }

        static IEnumerable<int> GetInts()
        {
            while (true)
            {
                yield return new Random().Next(int.MinValue, int.MaxValue);
            }
        }
    }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655818
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

там код в цикле ни разу не выполнится, потому что на Count() будет вечный цикл.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655822
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelouchuser7320,

Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной".
P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ...
P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу.
1. А что, они не могли там внутри, в реализации, условие добавить, чтобы скипать сразу на нужный индекс?

2. Я так понимаю, в Линке вообще нет быстрой (O(1)) операции для начала работы с произвольного непервого индекса?

3. А как насчёт "дойти не до конца"? Надеюсь, Take(5) по коллекции из 10 элементов не заставляет Линк делать ещё 5 скипов после первых пяти элементов?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655826
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степивсе в природе енумераторов..
Да знаю я (кстати, спасибо, что напомнили - постоянно забываю).

А почему нельзя для узких мест сделать отдельные проверки и ускорить эти места? Внутри Линка, я имею ввиду.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655833
Lelouch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

user7320 А что, они не могли там внутри, в реализации, условие добавить, чтобы скипать сразу на нужный индекс?

1) Ну напишите свой Ext метод, который будет переопределять поведение для List ))

user7320 Я так понимаю, в Линке вообще нет быстрой (O(1)) операции для начала работы с произвольного непервого индекса?

2) На форуме упоминалось, что, например ElementAt для List именно по индексу работает

user7320А как насчёт "дойти не до конца"? Надеюсь, Take(5) по коллекции из 10 элементов не заставляет Линк делать ещё 5 скипов после первых пяти элементов?

3) А вы таки разберитесь как LINQ работает)) Ответ: нет, о причинах подумайте сами )
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655834
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
давай еще пример, измени код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
  static void Main(string[] args)
        {
            IEnumerable<int> s = GetInts();
            //foreach (var i in s)
            //{
            //    Console.Write(i);
            //}
            for (int i = 0; i < s.Count(); i++)
            {
                Console.Write(i);
            }

        }

        static IEnumerable<int> GetInts()
        {
            var i = 0;
            while (i<10)
            {
                i++;
                yield return new Random().Next(int.MinValue, int.MaxValue);
            }
        }


и посмотри под отладчиком, как ведет себя метод s.Count() при каждой итерации по циклу.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38655892
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
не слышу возмущений, что абстракция потекла..
как быть?
Код: c#
1.
2.
3.
4.
5.
           var enumerable = s as int[] ?? s.ToArray(); 
            for (int i = 0; i < enumerable.Count(); i++)
            {
                Console.Write(i);
            }


а если много? сожрет память(, зато быстрый доступ)
Это Вам решать, есть расширения и вперед..
И обещанная головоломка, ( не от меня) типа: а схуяли так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 static void Main(string[] args)
        {
            var ob = new { enumerator = new List<int> { 1, 2 }.GetEnumerator() };
            while (ob.enumerator.MoveNext()) 
            {
                Console.Write(ob.enumerator.Current);
            }
        }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656107
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи И обещанная головоломка, ( не от меня) типа: а схуяли так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 static void Main(string[] args)
        {
            var ob = new { enumerator = new List<int> { 1, 2 }.GetEnumerator() };
            while (ob.enumerator.MoveNext()) 
            {
                Console.Write(ob.enumerator.Current);
            }
        }


Это связано с анонимными типами. Чёта как-то так , хотя и не совсем в тему, по-моему (т. к. в вашем примере никто этот анонимный тип не заставляет реализовывать интерфейс, у него есть всего лишь свойство с таким интерфейсом).

Вот так работает

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        class My
        {
            public IEnumerator<int> enumerator;
        }

        static void Main(string[] args)
        {
            var ob = new My() { enumerator = new List<int> { 1, 2 }.GetEnumerator() };

            while (ob.enumerator.MoveNext())
            {
                Console.Write(ob.enumerator.Current);
            }

            Console.Read();
        }



Ну а вообще, я думаю, сборщик мусора постарался. Списка уже не существует. Вернее,
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656117
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ваще, надо внутрь List<T>.Enumerator смотреть, как он MoveNext реализует.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656123
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
не слышу возмущений, что абстракция потекла..
как быть?
Код: c#
1.
2.
3.
4.
5.
           var enumerable = s as int[] ?? s.ToArray(); 
            for (int i = 0; i < enumerable.Count(); i++)
            {
                Console.Write(i);
            }


а если много? сожрет память(, зато быстрый доступ)
Это Вам решать, есть расширения и вперед.
Чего ты мне Count() суёшь? Он же будет каждый раз итератором по все коллекции ходить. Либо Length, либо Count() до цикла один раз вызвать и в переменную результат запихать.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656124
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

анонимный тип неизменяем?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656143
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя, анонимные типы тут не причём. Вот так, например, всё работает

Код: c#
1.
2.
3.
4.
5.
6.
            var ob = new { enumerator = new List<int> { 1, 2 } };
            var o = ob.enumerator.GetEnumerator();
            while (o.MoveNext())
            {
                Console.Write(o.Current);
            }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656151
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, список инстанцироваться не успел? Причина может быть в структуре Enumerator списка - структуры же копируются при их назначении - т. е. каждый раз новый объект создаётся. Т. е. он назначил структуру Enumerator, когда ещё список не имел значений 1 и 2, поэтому Enumerator всегда возвращает дефолтное значение для int.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656152
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако, в этом случае бы он завершился сразу бы после первой же итерации, наверное, а он в бесконечный цикл вошёл.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656155
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е..
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656170
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е..
Отгадка-то есть?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656194
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое,
я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12
тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы.
Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656213
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое,
я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12
тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы.
Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12
Это "джамп ту метод" который? Ну дошёл я до

public bool MoveNext();

в теле List<T>. Дальше что?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656217
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
GetEnumerator() это структура.......
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656221
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
  // Summary:
        //     Enumerates the elements of a System.Collections.Generic.List<T>.
        [Serializable]
        public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
        {

            // Summary:
            //     Gets the element at the current position of the enumerator.
            //
            // Returns:
            //     The element in the System.Collections.Generic.List<T> at the current position
            //     of the enumerator.
            public T Current { get; }

            // Summary:
            //     Releases all resources used by the System.Collections.Generic.List<T>.Enumerator.
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
            public void Dispose();
            //
            // Summary:
            //     Advances the enumerator to the next element of the System.Collections.Generic.List<T>.
            //
            // Returns:
            //     true if the enumerator was successfully advanced to the next element; false
            //     if the enumerator has passed the end of the collection.
            //
            // Exceptions:
            //   System.InvalidOperationException:
            //     The collection was modified after the enumerator was created.
            public bool MoveNext();
        }
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656222
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиuser7320,
GetEnumerator() это структура.......
Я знаю. Это тип значения.
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656226
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Current всё время возвращает 0. Это потому, что он неопределён. Я так понимаю, что для неопределённого значения Current возвращается дефолтное значение для T.

Теперь почему MoveNext() каждый раз делает Current нулём?
...
Рейтинг: 0 / 0
Почему LINQ такой тормозной?
    #38656227
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Current всё время возвращает 0. Это потому, что он неопределён
В смысле, до первого вызова MoveNext
...
Рейтинг: 0 / 0
25 сообщений из 72, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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