|
Скорость цикла и проекция
|
|||
---|---|---|---|
#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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2019, 19:20 |
|
Скорость цикла и проекция
|
|||
---|---|---|---|
#18+
в первом случае есть переменная индексатор и обращение к массиву идет по индексу элемента в этом массив а во втором случае используется итератор для перебора всех значений, принцип работы которого совершенно иной. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2019, 20:25 |
|
Скорость цикла и проекция
|
|||
---|---|---|---|
#18+
Хелпер вызывает метод Enumerable.Select, все перегрузки которого вызывают вот этот метод с yield return в теле цикла. yield return приводит к тому, что на уровне IL создаётся отдельный класс-итератор. Далее, каждая перегрузка Enumerable.Select принимает одним из аргументов делегат, который опять же на уровне IL компилируется в отдельный анонимный класс. Итого, мы как минимум получаем два callvirt - на экземпляре итератора, и на экземпляре класса делегата. При большом количестве элементов коллекции это выливается в ощутимые накладные расходы. Ну, а в приведенном примере еще и создается отдельный тип (опять же в IL) для System.ValueTuple<T, T1>, создаются его экземпляры (на стеке), итд итп. Даже перебор результата вот такого метода-хелпера уже отрабатывает раза в 2 дольше, чем просто перебор исходного листа: Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 07:19 |
|
Скорость цикла и проекция
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Понял, спасибо. Вообщем yield return там, зря компилятор не оптимизирует, ведь количество известно. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 11:02 |
|
Скорость цикла и проекция
|
|||
---|---|---|---|
#18+
Hexag0v Вообщем yield return там, зря компилятор не оптимизирует, ведь количество известно. при чём тут количество? метод расширения Select по спеке ленивый ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2019, 23:07 |
|
Скорость цикла и проекция
|
|||
---|---|---|---|
#18+
hVostt Hexag0v Вообщем yield return там, зря компилятор не оптимизирует, ведь количество известно. при чём тут количество? метод расширения Select по спеке ленивый В принципе да, выбирать метод перебора должен программист. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2019, 11:41 |
|
|
start [/forum/topic.php?fid=20&fpage=14&tid=1398716]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 231ms |
total: | 380ms |
0 / 0 |