|
Почему 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 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320Current всё время возвращает 0. Это потому, что он неопределён В смысле, до первого вызова MoveNext ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 17:47 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, потому что передаются по значению при каждом ob.enumeraror будет новая структура вываливать из объекта по этому цикл не кончится, текущим будет дефолтное значение. public IEnumerator<int> enumerator; - тут Вы ее упаковали. все в порядке. Могли бы и поставить List<int>.Enumerator тоже бы скорее всего произошла бы упаковка так как типы разные. Структуры странные типы и надо с ними очень осторожно.. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 18:32 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, потому что передаются по значению при каждом ob.enumeraror будет новая структура вываливать из объекта по этому цикл не кончится, текущим будет дефолтное значение. public IEnumerator<int> enumerator; - тут Вы ее упаковали. все в порядке. Могли бы и поставить List<int>.Enumerator тоже бы скорее всего произошла бы упаковка так как типы разные. Структуры странные типы и надо с ними очень осторожно.. что-то я не очень понял где упаковка? Код: 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, 18:39 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
netivan, Код: c# 1. 2. 3. 4.
приведение значимых к интерфейсу не? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 18:50 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиnetivan, Код: c# 1. 2. 3. 4.
приведение значимых к интерфейсу не? да. все равно не понял причем тут упаковка. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 18:58 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
netivan, может так попонятней будет Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 19:03 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиnetivan, может так попонятней будет Код: c# 1. 2. 3. 4. 5.
завтра покумекаю :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 19:12 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320Хотя, анонимные типы тут не причём. Вот так, например, всё работает Код: c# 1. 2. 3. 4. 5. 6.
o - у тя не является уже анонимным типом - что ты здесь хотел проверить? Дело как раз в неизменяемости анонимного типа, а не в упаковке-распаковке. Когда в анонимном типе структура - ее не изменить. Когда объект(или ссылка на интерфейс) ссылку тоже не изменить, но объект на которую указывает ссылка - пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 20:08 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
refreguser7320Хотя, анонимные типы тут не причём. Вот так, например, всё работает Код: c# 1. 2. 3. 4. 5. 6.
o - у тя не является уже анонимным типом - что ты здесь хотел проверить? Дело как раз в неизменяемости анонимного типа, а не в упаковке-распаковке. Когда в анонимном типе структура - ее не изменить. Когда объект(или ссылка на интерфейс) ссылку тоже не изменить, но объект на которую указывает ссылка - пожалуйста. Дело всё же в структуре, по-моему. Я привёл пример с кастомным классом My и с переменной var o. Если Му и без переменной, то не работает. Если анонимный класс и без переменной, то не работает. Если Му и с переменной, то работает. Если анонимный тип и с переменной, то работает. Значит, анонимный тип тут не причём. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 20:50 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320Если Му и без переменной, то не работает. Если анонимный класс и без переменной, то не работает . Если Му и с переменной, то работает. Если анонимный тип и с переменной, то работает.поправил ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 21:29 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
refreguser7320Если Му и без переменной, то не работает. Если анонимный класс и без переменной, то не работает . Если Му и с переменной, то работает. Если анонимный тип и с переменной, то работает.поправил Да, точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 21:42 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Ну, положим, анонимные типы действительно незименяемые в том смысле, что содержат рид-онли свойства. http://stackoverflow.com/questions/14336669/why-anonymous-type-are-immutable-in-c Но почему всё же нуль постоянно? Код: c# 1. 2. 3. 4. 5.
Вот возьмём строчку new { enumerator = new List<int> { 1, 2 }.GetEnumerator() } В ob.enumerator хранится копия энумератора из списка. Я так понимаю, ключ в том, что эта копия не имеет связи со списком ? Т. е. это объект структуры, вытащенный из объекта списка, и имеющий поэтому только MoveNext, Reset и Current, который по дефолту всегда 0? Теперь возьмём строчку ob.enumerator.MoveNext() ob.enumerator вернёт снова копию структуры, а значит, что Current снова будет 0. Но почему возвращается всегда true, а не false? Ведь со списком-то связи нет. Это что, особенность внтуренней реализации Enumerator.MoveNext() , что она всегда true возвращает в такой ситуации? А в общей картине получается, что у нас и в условии цикла и в теле постоянно создаются новые копии структуры. Т. е. на каждую итерацию по 2 копии структуры. Правильно я понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 22:08 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, enumerator работает примерно так: Current=default(T) - 0 State=0 - готовность!!! (приватная переменная, мы не видим) MoveNext() - на выходе true - так как есть первый элемент Current=1 (первый элемент) State=1 - первый элемент показываем MoveNext() - на выходе true - так как есть второй элемент Current=2 (второй элемент) State=2 - второй элемент показываем MoveNext() - на выходе false - так как нет третьего элемента Current=хз (не определено) State=хз - не определено Так вот State мы в анонимном типе не можем изменить - впрочем, как и Current - они так нулями и остаются ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 22:35 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, гыгыгыггыг у меня нет слов еще раз и последний ( я сто раз пожалел что не свалил отсюда, потерял весь день с вами..) while (ob.enumerator.MoveNext()) // получает новую структуру со списком, делает шаг { Console.Write(ob.enumerator.Current);// получает новую структуру со списком указатель позиции -1, шага нет, по контракту возвращает default(T) } и т.д и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.05.2014, 22:35 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Чёта структуры какие-то замороченные. Слишком им много внимания надо уделять. new забудешь написать, и уже проблемы . После С++, где структуры это те же классы, непросто из головы вытолкать старые привычки и втолкнуть новые. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 12:20 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320Чёта структуры какие-то замороченные. оптимизация, ничего особенного ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 12:28 |
|
Почему 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. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 12:48 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степи, ldfld vs ldflda ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 13:55 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
ЕвгенийВГде-то в степи, ldfld vs ldflda это следствие, а не причина ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 14:12 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, Чет Вы меня удивляете, я вам в прошлом примере дал объяснения, вы промолчали - поняли, тут показал - опять молчание. а что же вы не кричали в прошлом примере - почему постоянно новая структура вылазит из анонимного типа, при обращению к полю? этот пример как бы продолжение первого. Поля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию, можно как аксиому запомнить, в анонимных типах , там нет авто свойств, там есть свойство только с одним акцессором ( без мутатора), которое возвращает закрытое поле помеченное readonly , ну и исходя из этого инициализируемое через конструктор.. Структуры хитрая штука.. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 17:09 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
к кстати кто пользуется решарпером, решарпер вежливо напоминает про эти нюансы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 17:12 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степи Структуры хитрая штука.. Потому и не делаю никогда своих. Выигрыш в производительности сомнительный, а проблем создают много! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 17:36 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
что мне попалось http://top.rbc.ru/economics/29/05/2014/927223.shtml#xtor=AL- [internal_traffic]--[rbc.ru]-[main_body]-[item_2] ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 17:40 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степичто мне попалось http://top.rbc.ru/economics/29/05/2014/927223.shtml#xtor=AL- [internal_traffic]--[rbc.ru]-[main_body]-[item_2] Начали за здравие, кончили за упокой. Какое отношение Паша Дуров имеет к внутренней организации LINQ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 17:53 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, а что такого, я всегда иногда вставляю ссылки не по теме ( но имхо интер -я) да и ветка можно сказать закончена... или вы хотите еще загадку- вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 18:13 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, Чет Вы меня удивляете, я вам в прошлом примере дал объяснения, вы промолчали - поняли, тут показал - опять молчание. а что же вы не кричали в прошлом примере - почему постоянно новая структура вылазит из анонимного типа, при обращению к полю? этот пример как бы продолжение первого. Поля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию, можно как аксиому запомнить, в анонимных типах , там нет авто свойств, там есть свойство только с одним акцессором ( без мутатора), которое возвращает закрытое поле помеченное readonly , ну и исходя из этого инициализируемое через конструктор.. Структуры хитрая штука.. Да я прошлый пример, вроде, уже понял. Но скоро опять забуду. )) Я это, как бы ещё и работать пытаюсь. Не всё же сидеть на форуме. ))) В любом случае, спасибо, что помогали понять. Где-то в степиили вы хотите еще загадку- вопрос? Вы их откуда берёте? А потом на собеседованиях джуниорам задаёте? :) Где-то в степичто мне попалось http://top.rbc.ru/economics/29/05/2014/927223.shtml#xtor=AL- [internal_traffic]--[rbc.ru]-[main_body]-[item_2] Всё правильно сделал. Только непонятно, почему в Литву (которая, на мой взгляд, сама является полудепрессивной страной - население убывает, экономика не на высоте), а не в Америку, Австралию, Канаду или Британию, которые, ходят слухи, являются раем для айти-компаний. Да и в последних скорее можно найти говорящих по-английски, чем в Литве, где надо ещё и по-литовски (а накой оно надо, язык местечковый, никому в мире не нужный изучать?). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 19:29 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиПоля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию Так вроде, все структуры и так выдают копию при запросе? Кстати, когда вы ввели в структуру метод, изменяющий её поле, вы сделали свою структуру мутабельной? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 19:42 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Что интересно, под дебагом внутри метода Addint для перового экземпляра структуры видно, что поле изменяется и равно 100. А когда вышли из этого метода - поле снова равно 0. Это почему? Мой ответ: потому, что это не поле в методе, а его копия в виде локальной переменной. И изменилась с 0 до 100 копия, а не поле. Когда метод закончился, локальная переменная досталась сборщику мусора, а поле осталось неизменным. Правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 19:52 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиПоля помеченные модификатором readonly и которые описывают структуру , всегда при запросе выдают копию, можно как аксиому запомнить А откуда эта аксиома выводится? Я вот МСДН читаю, и там не нахожу такого в одном месте. Это что, надо по крупицам собирать из нескольких статей? Ну, при попытке сделать так w.Struct.Id = w.Struct.Id + 2; компилятор выдаёт такое Members of readonly field 'ConsoleApplication1.Program.MyClass.Struct' cannot be modified (except in a constructor or a variable initializer А если бы Struct был не структурой, а классом, пусть даже под readonly, то всё нормально меняется. Т. е. где-то в компиляторе есть такое правило, но в явном виде оно нигде не упоминается? Т. е. пока на нечто такое не наткнёшься, не поймёшь? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:07 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, вот аксиома user7320Когда метод закончился, локальная переменная досталась сборщику мусора ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:13 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Я тут посмотрел. Похоже, что, чтобы это понять, надо просто запомнить маааленький алгоритмец доступа к членам http://msdn.microsoft.com/en-us/library/aa691353(v=vs.71).aspx Этакий набор аксиом, хе-хе. Лично я никуя не понял и закрыл это дело. До лучших времён. Голову можно сломать. Доступ к членам в С# - это просто! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:16 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320Я тут посмотрел. Похоже, что, чтобы это понять, надо просто запомнить маааленький алгоритмец доступа к членам http://msdn.microsoft.com/en-us/library/aa691353(v=vs.71).aspx Этакий набор аксиом, хе-хе. Лично я никуя не понял и закрыл это дело. До лучших времён. Голову можно сломать. Доступ к членам в С# - это просто! В смысле, что там есть вариант ридонли структур, только я его не нашёл - там для меня какая-то каша. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:19 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
авторOne unfortunate design weakness in .net is that there is no means by which struct methods can indicate whether or not they will modify this. Из дырявых абстракций прямо хлещет. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:25 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Да ну нафиг эти структуры! Я ж теперь их как огня бояться буду! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:26 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
http://blogs.msdn.com/b/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx The relevant section of the specification is 7.5.4, which states that when resolving "E.I" where E is an object and I is a field... ...if the field is readonly and the reference occurs outside an instance constructor of the class in which the field is declared, then the result is a value, namely the value of the field I in the object referenced by E. The important word here is that the result is the value of the field, not the variable associated with the field. Readonly fields are not variables outside of the constructor. (The initializer here is considered to be inside the constructor; see my earlier post on that subject.) Great. What about that second dot, as in ".Mutate()"? We look at section 7.4.4 to find out how to invoke E.M(): Ну, мля, так нечестно! Они напридумывали там своих дырявых абстракций десятиуровневых. Они в этом аду варятся каждый день, а прикладным разработчикам задачи решать надо, а не в тонкостях языка разбираться. Прикладные разработчики только время от времени в это дело лезут, и сразу обратно, махнув рукой. Лучше раз в сутки сервера с утекающей памятью перегружать, чем разбираться в этой мозголомной помойке, которая, к тому же, через лет 5-7 снова станет не нужной МС и она снова сменит тренд. Липперт за мозголомство бабки получает, а я - за решение задач. Как грица, думать надо меньше, а соображать - больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:34 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Короче, кто осилил в спецификацию Сишарпа и может все эти section 7.5.4, section 7.x.y и пр. в голове одновременно и в разных вариациях держать на каждую строчку кода (а вдруг чего не так?! - оппа, справочка под рукой) - прётся, остальные могут идти накуй запоминают кучку "аксиом" в количестве нескольких тысяч штук на весь язык - всего лишь другой вариант спецификации. Короче, жопа с какой стороны ни посмотри. Конечно, Решарпер это хорошо. Но почему сама Студия или компилятор не подсказывают? Из первых комментариев к этой статье я так понял, что Решарпер где-то в средней категории и работает - где дизайнеры C# не решились вставить сообщение об ошибке или предупреждение, Решарпер решился. Вот это вот авторError 1 Members of readonly field 'ConsoleApplication1.Program.MyClass.Struct' cannot be modified (except in a constructor or a variable initializer) мало инфы даёт, потому что не уточняет, что это только для структур. Кажется, что это для всех ридонли членов, но по факту для ридонли классов-то таких ограничений нет. А вот этого из ошибки и не ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2014, 20:49 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320Что интересно, под дебагом внутри метода Addint для перового экземпляра структуры видно, что поле изменяется и равно 100. А когда вышли из этого метода - поле снова равно 0. Это почему? Мой ответ: потому, что это не поле в методе, а его копия в виде локальной переменной. И изменилась с 0 до 100 копия, а не поле. Когда метод закончился, локальная переменная досталась сборщику мусора, а поле осталось неизменным. Правильно?Нет. Думаю, уже сам это понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 11:00 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиuser7320, вот аксиома user7320Когда метод закончился, локальная переменная досталась сборщику мусораИ, совсем не аксиома. В общем случае это не так. И, конкретно, в рассматриваемом примере это не так ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 11:03 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
refreg, вы тоже считаете что сборщик проверяет локальные переменные при удалении? чистка стека это очень просто, передвигаем указатель в низ до первого еще живого, и все сборщику ваще до фонаря до локальных п. значимые ему не интересны, указатель на кучу тоже.. может имелось в виду, локальная переменная замкнутая на лябду - так она уже не локальная она в куче через служебный класс... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 11:13 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиrefreg, вы тоже считаете что сборщик проверяет локальные переменные при удалении? чистка стека это очень просто, передвигаем указатель в низ до первого еще живого, и все сборщику ваще до фонаря до локальных п. значимые ему не интересны, указатель на кучу тоже.. может имелось в виду, локальная переменная замкнутая на лябду - так она уже не локальная она в куче через служебный класс...Вот сейчас согласен. Сборщику мусора плевать на структуру. Если, только она не упакована. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 11:20 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
refreg, Говорить о сборщике и стеке это вообще бессмысленно. У сборщика своя жизнь - у стека своя, и нигде они не пересеваются Вообще сборщик может не вызваться никогда за время жизни приложения , и что тогда ? стек впадет в уныние...? ЕвгенийПотому и не делаю никогда своих. Выигрыш в производительности сомнительный, а проблем создают много! где то читал , раз спросили Липперта, чем Вы руководствуетесь выбирая структуру и класс. он ответил - поведением типа, ему - так вроде ж очевидно одна там другая тут лежит?. Он ответил - поведение важнее, где лежит это уже вторично.. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 12:36 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
Где-то в степиrefreg, Говорить о сборщике и стеке это вообще бессмысленно.С этим согласен. Тогда объясните, что Вы тут 16099524 назвали аксиомой. Или просто указали, что переменная не нужна, оборотом "сборщик мусора" (я понимаю, что там цитата, не Ваша речь). ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 13:27 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
refreg, так это тролинг, я и хотел выяснить что это было авторКогда метод закончился, локальная переменная досталась сборщику мусора или парапраксис или тонкий троллинг или неудачный выстрел в голову при чистке оружия.... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.05.2014, 13:45 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320 Липперт за мозголомство бабки получает, а я - за решение задач. Эрик один самых толковых среди ныне живущих и уже давно не работает в Microsoft. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2014, 08:29 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
ЕвгенийВuser7320 Липперт за мозголомство бабки получает, а я - за решение задач. Эрик один самых толковых среди ныне живущих и уже давно не работает в Microsoft. Я к тому, что в Сишарпе уже настолько всё переусложнили, что знать все тонкости в любой момент может разве что этот Эрик и ему подобные, которые годами спецификацию Сишарпа грызут. А люди, которые не теорию учат, а должны решать задачи, просто уже не в состоянии угнаться за всеми нюансами языка... И при всём при этом абстракции у них всё равно изрядно протекают - т. е. таки спецификация начинает походить не на логически отстроенную систему, а на сборник кейсов и исключений, который надо не понять, а тупо запомнить. А чтобы понять, откуда эти исключения взялись - таки вылезти за рамки спецификации и посмотреть, что внутрях. Они бы хоть вычёркивали всякое, которое в Сишарпе уже устарело. Ну, не знаю... Взять ту же книжку "C# in Depth" Скита - он там приводит разные кейсы на разные аспекты языка и как они изменялись от версии 2.0 к версии 4.0. Вот почему бы не оставить всерсию 4.0, а на остальное забить? Да я понимаю, что совместимость и всё такое, но от обилия "как сделать одно и то же кучей разных способов" уже в голове калейдоскоп и это ведёт скорее не к гибкости языка, а к увеличению количества ошибок. Сишарп хорош тем, что пока говна в нём поменьше, чем в той же Джаве, а возможностей побольше в общем и целом. Не принимайте близко к сердцу - это мнение диванного аналитика. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2014, 22:08 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, И где ты в java говно видишь, уточни. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2014, 23:06 |
|
Почему LINQ такой тормозной?
|
|||
---|---|---|---|
#18+
user7320, Да бросьте свою истерику, язык как язык, скажу более ( имхо) писать можно на нем как хочешь и куда хочешь, не утруждая себя знаниями и т.д. ( например можно забыть что такое энумератор, можно перечисление назвать деревом выражений, и них-я, скомпилится родной)) автор а на сборник кейсов и исключений, который надо не понять, а тупо запомнить дак если не понимаете, приходится запоминать как аксиому, например замыкать на ref out незя..., в джаве или С вас бы в угол запинали да системником припечатали, а тут ( в этом языке все в порядке вещей) Зы в нем не говна меньше, в нем просто любое говно может писать любое говно... ( сборщике подтерет ) :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.06.2014, 23:22 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1402861]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 178ms |
0 / 0 |