|
ref и out параметры
|
|||
---|---|---|---|
#18+
Никакой код с реф/аут отбракован не был, его утвердил тимлид. Сабж не любит напарник, ревьюят оба. Напарник внятно объяснить свою нелюбовь не смог, поэтому я попросил помощь зала, поскольку в голову никогда не приходило страдать такими вопросами. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2019, 22:44 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
stenfordесли у тебя постоянно используется ref/out/Tuple в коде - то точно что-то не то в консерватории, скорее всего очень непродуманная структура кода и классов, методы делающие и возвращающие несвязанные вещи.В консерватории очень много чего не так. Например, провайдер данных может зависеть от потребителя.) Не я эту консерваторию запиливал. И "постоянство" тут относительное. Я использую сабж редко, но каждый раз, как использую, получаю замечание и требование переписать. Иногда переписываю, иногда отстаиваю ref/out, если вижу, что альтернативные варианты чреваты кучей декоративного говнокода, который даже не будет повторно использован. stenfordТакой код невозможно нормально читать и сопровождать.Некоторые куски я переписываю декларативно на linq, даже не пытаясь разобраться, как исходное говно работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2019, 23:01 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
Antonariy... на linq, даже не пытаясь разобраться, как исходное говно работает. лучше чем linq - стопудово ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 00:19 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
ViPRosлучше чем linq - стопудово О, вот и некрофилия подтянулась. Дженерики - порождение диавола. Самому не смешно, в 2019 году-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 00:40 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatViPRosлучше чем linq - стопудово О, вот и некрофилия подтянулась. Дженерики - порождение диавола. Самому не смешно, в 2019 году-то? когда пишешь всякую фигню можно и дженерики приходи лет через 20 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 01:10 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
ViPRosприходи лет через 20 Послушать, как ты будешь тут спрашивать про миграцию с фокспро 2.6 на 6.0? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 01:28 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
ViPRosAntonariy... на linq, даже не пытаясь разобраться, как исходное говно работает. лучше чем linq - стопудово"лучше" - характеристика качественная, ничего не говорящая о предмете конкретно. решения с linq обычно работают медленнее, но они втрое-вчетверо меньше по объему и во столько же более читаемее. в том слое, где практикуются такие переписывания, это приемлемо, прозрачность и безглючность кода важнее производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 10:27 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
Antonariyрешения с linq обычно работают медленнее В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 10:42 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatAntonariyрешения с linq обычно работают медленнее В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.Замедление не от самого linq, а от обвеса, с которым он работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 11:21 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
А обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 11:24 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatAntonariyрешения с linq обычно работают медленнее В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach. В случае LINQ to Objects компиляции лямб нет, если не делать AsQueryable ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 11:29 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
AntonariyЗамедление не от самого linq, а от обвеса, с которым он работает. Есть замедление, ибо там сплошной вызов делегатов, хотя с другой стороны ленивые вычисления. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 11:30 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
ЕвгенийВAntonariyЗамедление не от самого linq, а от обвеса, с которым он работает. Есть замедление, ибо там сплошной вызов делегатов, хотя с другой стороны ленивые вычисления. Делегат как-то принципиально по-другому вызывается по сравнению с обычным методом? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 11:49 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
AntonariyА обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает. Если с екселем работаешь через COM, то там накладные расходы на его вызовы такие, что все остальное вообще никак влиять не должно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 11:55 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatДелегат как-то принципиально по-другому вызывается по сравнению с обычным методом? Ясен пень Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Против Код: c# 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 12:09 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
ЕвгенийВ, Инструкций больше, это-то и так понятно, но, именно принципиальной разницы, как, например "раннее связывание" и "позднее связывание" тут нет. И там и там метод прямо по указателю вызывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 12:43 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatAntonariyА обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает. Если с екселем работаешь через COM, то там накладные расходы на его вызовы такие, что все остальное вообще никак влиять не должно.А от COM никуда не денешься, виндовый офис имеет его в своем фундаменте. Работаю через NET-обертки ExcelDna+NetOffice, так что добавь еще накладные расходы внутри них. Однако даже их сумма ничто по сравнению с производительностью самих вызываемых методов. Например, удаление диапазона строк. Удаление одной строки и сотни строк по времени почти одинаково, но если удалять диапазон построчно, то время возрастает в разы, даже если поотключать экселю все обновления и события. Это самый очевидный кейс, и его я оптимизирую, если натыкаюсь на построчное удаление, а самый распространенный - атомарная операция присвоения массива диапазону, и тут местами приходится разоптимизировать. Метод, создающий массив, обычно имеет кучу параметров, определяющих его внешний вид и размер, данные для массива разнородные, полет мысли авторов, собирающих эти данные в кучу, неописуем. В результате имеем кучу нечитаемых методов, непригодных для повторного использования - грубо говоря, в новом методе массив формируется новым способом, и здесь правят бал Tuple<>. Приходится дробить атомарную операцию на осмысленные куски (которые возможно повторно использовать в других методах), выводя кусками и массив, и это основная причина проседания производительности. Но терпимая. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:12 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatЕвгенийВ, Инструкций больше, это-то и так понятно, но, именно принципиальной разницы, как, например "раннее связывание" и "позднее связывание" тут нет. И там и там метод прямо по указателю вызывается.так-то ранее связывание отличается от позднего тем, что во втором как раз и есть больше инструкций, занимающимися тем, чем при раннем связывании занимается компилятор - определением адреса вызываемого метода) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 14:20 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
Antonariy, У вас проблема вроде не в скорости была). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 15:29 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
в Linq почти все вызовы больше O(n), так как последовательность IEnumerabl<T> не упорядочена, не имеет фиксированного размера, нет предоставляет прямой доступ по индексу к элементам последовательности, что делает невозможным применение более быстрых алгоритмов логарифмической сложности O(logn) и константного время доступа к элементам последовательности. Время материализации постоянно O(c) для всех случаев, им можно пренебречь, ведь и для обычных массивов и для IEnumerable<T> данные в любом случае придется загрузить. Массив в отличии от последовательности, это непрерывная область в памяти фиксированной длинны, то есть вероятность того, что весь массив или его часть окажется закэширован выше, чем в случае с последовательностью, ведь не факт, что за кулисами массив. И в момент обращения к первому элементу, 2 вообще еще существует. Linq и последовательности, по очевидным причинам удобнее, лаконичнее, короче, нагляднее и выразительнее, чем работа с более низкоуровневыми типами. А концепция методов расширения позволяет расширить её и добавить сколько угодно новых методов. За собой замечаю, что все больше отдаю предпочтение массивам T[], особенно если последовательность имеет фиксированный размер и важен доступ через индексатор. Оптимизация нужна не всегда и не везде. Нет смысла городить сложные алгоритмы поиска в наборе из 100 записей, при реализации функционала если задача выполняется за разумное\требуемое время, нет смысла делать её быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 17:00 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
Roman Mejtes, В Linq многие методы оптимизированы за счет того, что они сначала смотрят, что на самом деле лежит под IEnumerable и для "знакомых" им коллекций вызывают соответствующие "быстрые" методы или свойства. Поясню на примере: Код: c# 1.
В этом случае Сount() распознает, что в него передали массив и не станет просто перебирать его элементы и подстчитывать, а сразу вернет свойство Length. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 17:37 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
ЕвгенийВВ случае LINQ to Objects компиляции лямб нет, если не делать AsQueryable Да, посмотрел - там блямбда преобразуется в делегат уже самим компилятором. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 17:39 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
fkthatRoman Mejtes, В Linq многие методы оптимизированы за счет того, что они сначала смотрят, что на самом деле лежит под IEnumerable и для "знакомых" им коллекций вызывают соответствующие "быстрые" методы или свойства. Поясню на примере: Код: c# 1.
В этом случае Сount() распознает, что в него передали массив и не станет просто перебирать его элементы и подстчитываеть, а сразу вернет свойство Length. Ваш пример, это наилучший результат выполнения метода, подобный тому, если бы N было равно 0 или 1, размер коллекции мы бы получили немедленно, практически за константное время. Но при оптимизации рассматривают наихудший из возможных сценариев, а не наилучший. В худшем из сценариев, данный метод может занимать огромное количество времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 18:05 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
Antonariyтак-то ранее связывание отличается от позднего тем, что во втором как раз и есть больше инструкций, занимающимися тем, чем при раннем связывании занимается компилятор - определением адреса вызываемого метода) Ну так если рассуждать, то вообще ничего от ничего не отличается. MS Office отличается от SQL Server только количеством и порядком инструкций. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 18:06 |
|
ref и out параметры
|
|||
---|---|---|---|
#18+
Roman MejtesВаш пример, это наилучший результат выполнения метода, подобный тому, если бы N было равно 0 или 1, размер коллекции мы бы получили немедленно, практически за константное время. Но при оптимизации рассматривают наихудший из возможных сценариев, а не наилучший. В худшем из сценариев, данный метод может занимать огромное количество времени. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2019, 18:18 |
|
|
start [/forum/topic.php?fid=20&msg=39816662&tid=1398931]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 170ms |
0 / 0 |