|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
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 . ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:03 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной". P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ... P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:15 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:20 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степи, там код в цикле ни разу не выполнится, потому что на Count() будет вечный цикл. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:22 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Lelouchuser7320, Как по вашему работает Skip ? - это и даст пояснение почему он "тормозной". P.S. Производительность LINQ To Object вообще не может сильно отличаться от производительности соответствующего набора циклов foreach ... P.P.S. И естественно for тут оказывается быстрее, потому что использует не перебор энумератора, а доступ по индексу. 1. А что, они не могли там внутри, в реализации, условие добавить, чтобы скипать сразу на нужный индекс? 2. Я так понимаю, в Линке вообще нет быстрой (O(1)) операции для начала работы с произвольного непервого индекса? 3. А как насчёт "дойти не до конца"? Надеюсь, Take(5) по коллекции из 10 элементов не заставляет Линк делать ещё 5 скипов после первых пяти элементов? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:24 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степивсе в природе енумераторов.. Да знаю я (кстати, спасибо, что напомнили - постоянно забываю). А почему нельзя для узких мест сделать отдельные проверки и ускорить эти места? Внутри Линка, я имею ввиду. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:26 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, user7320 А что, они не могли там внутри, в реализации, условие добавить, чтобы скипать сразу на нужный индекс? 1) Ну напишите свой Ext метод, который будет переопределять поведение для List )) user7320 Я так понимаю, в Линке вообще нет быстрой (O(1)) операции для начала работы с произвольного непервого индекса? 2) На форуме упоминалось, что, например ElementAt для List именно по индексу работает user7320А как насчёт "дойти не до конца"? Надеюсь, Take(5) по коллекции из 10 элементов не заставляет Линк делать ещё 5 скипов после первых пяти элементов? 3) А вы таки разберитесь как LINQ работает)) Ответ: нет, о причинах подумайте сами ) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:30 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
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.
и посмотри под отладчиком, как ведет себя метод s.Count() при каждой итерации по циклу. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:30 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, не слышу возмущений, что абстракция потекла.. как быть? Код: c# 1. 2. 3. 4. 5.
а если много? сожрет память(, зато быстрый доступ) Это Вам решать, есть расширения и вперед.. И обещанная головоломка, ( не от меня) типа: а схуяли так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 14:58 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степи И обещанная головоломка, ( не от меня) типа: а схуяли так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Это связано с анонимными типами. Чёта как-то так , хотя и не совсем в тему, по-моему (т. к. в вашем примере никто этот анонимный тип не заставляет реализовывать интерфейс, у него есть всего лишь свойство с таким интерфейсом). Вот так работает Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Ну а вообще, я думаю, сборщик мусора постарался. Списка уже не существует. Вернее, ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:39 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
А ваще, надо внутрь List<T>.Enumerator смотреть, как он MoveNext реализует. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:43 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, не слышу возмущений, что абстракция потекла.. как быть? Код: c# 1. 2. 3. 4. 5.
а если много? сожрет память(, зато быстрый доступ) Это Вам решать, есть расширения и вперед. Чего ты мне Count() суёшь? Он же будет каждый раз итератором по все коллекции ходить. Либо Length, либо Count() до цикла один раз вызвать и в переменную результат запихать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:45 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степи, анонимный тип неизменяем? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:46 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Хотя, анонимные типы тут не причём. Вот так, например, всё работает Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:54 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Может, список инстанцироваться не успел? Причина может быть в структуре Enumerator списка - структуры же копируются при их назначении - т. е. каждый раз новый объект создаётся. Т. е. он назначил структуру Enumerator, когда ещё список не имел значений 1 и 2, поэтому Enumerator всегда возвращает дефолтное значение для int. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:58 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Однако, в этом случае бы он завершился сразу бы после первой же итерации, наверное, а он в бесконечный цикл вошёл. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 16:58 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:01 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, вам то это зачем ( расслабитесь...)? это скорее нужно разработчикам, а не программистам от C# которым специфика языка в рот не е.. Отгадка-то есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:11 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое, я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12 тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы. Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:23 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, вот странны ваши метания, ну предположим не понятный код, и мне часто не понятно многое, я не начинаю рыскать ( кромсать все тело), а начинаю по техничку резать по кусочкам через F12 тут надо просто пару раз ударит по ф12 и посмотреть что там за тип, и знать как ведут себя значимые типы. Это как работа прозектора ( к стати считается очень высшей квалификацией по знаниям у врачей, так как они выносят вердикт работы врача ( во многих случаях)), тут не надо спешки, надо просто долбить по ф12 Это "джамп ту метод" который? Ну дошёл я до public bool MoveNext(); в теле List<T>. Дальше что? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:39 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, GetEnumerator() это структура....... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:43 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:44 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, GetEnumerator() это структура....... Я знаю. Это тип значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:44 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Current всё время возвращает 0. Это потому, что он неопределён. Я так понимаю, что для неопределённого значения Current возвращается дефолтное значение для T. Теперь почему MoveNext() каждый раз делает Current нулём? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:47 |
|
|
start [/forum/topic.php?fid=20&msg=38656194&tid=1402861]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 149ms |
0 / 0 |