Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему LINQ такой тормозной? / 25 сообщений из 72, страница 1 из 3
29.05.2014, 14:03
    #38655788
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
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
29.05.2014, 14:15
    #38655805
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
user7320,

Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной".
P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ...
P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу.
...
Рейтинг: 0 / 0
29.05.2014, 14:20
    #38655817
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
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
29.05.2014, 14:22
    #38655818
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степи,

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

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

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

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

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

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

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

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

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

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

3) А вы таки разберитесь как LINQ работает)) Ответ: нет, о причинах подумайте сами )
...
Рейтинг: 0 / 0
29.05.2014, 14:30
    #38655834
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
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
29.05.2014, 14:58
    #38655892
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
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
29.05.2014, 16:39
    #38656107
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степи И обещанная головоломка, ( не от меня) типа: а схуяли так?
Код: 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
29.05.2014, 16:43
    #38656117
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
А ваще, надо внутрь List<T>.Enumerator смотреть, как он MoveNext реализует.
...
Рейтинг: 0 / 0
29.05.2014, 16:45
    #38656123
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степи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
29.05.2014, 16:46
    #38656124
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степи,

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

Код: 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
29.05.2014, 16:58
    #38656151
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Может, список инстанцироваться не успел? Причина может быть в структуре Enumerator списка - структуры же копируются при их назначении - т. е. каждый раз новый объект создаётся. Т. е. он назначил структуру Enumerator, когда ещё список не имел значений 1 и 2, поэтому Enumerator всегда возвращает дефолтное значение для int.
...
Рейтинг: 0 / 0
29.05.2014, 16:58
    #38656152
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Однако, в этом случае бы он завершился сразу бы после первой же итерации, наверное, а он в бесконечный цикл вошёл.
...
Рейтинг: 0 / 0
29.05.2014, 17:01
    #38656155
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
user7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е..
...
Рейтинг: 0 / 0
29.05.2014, 17:11
    #38656170
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степиuser7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е..
Отгадка-то есть?
...
Рейтинг: 0 / 0
29.05.2014, 17:23
    #38656194
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
user7320,
вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое,
я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12
тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы.
Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12
...
Рейтинг: 0 / 0
29.05.2014, 17:39
    #38656213
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степиuser7320,
вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое,
я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12
тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы.
Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12
Это "джамп ту метод" который? Ну дошёл я до

public bool MoveNext();

в теле List<T>. Дальше что?
...
Рейтинг: 0 / 0
29.05.2014, 17:43
    #38656217
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
user7320,
GetEnumerator() это структура.......
...
Рейтинг: 0 / 0
29.05.2014, 17:44
    #38656221
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Код: 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
29.05.2014, 17:44
    #38656222
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Где-то в степиuser7320,
GetEnumerator() это структура.......
Я знаю. Это тип значения.
...
Рейтинг: 0 / 0
29.05.2014, 17:47
    #38656226
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему LINQ такой тормозной?
Current всё время возвращает 0. Это потому, что он неопределён. Я так понимаю, что для неопределённого значения Current возвращается дефолтное значение для T.

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


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