Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
Никакой код с реф/аут отбракован не был, его утвердил тимлид.
Сабж не любит напарник, ревьюят оба.
Напарник внятно объяснить свою нелюбовь не смог, поэтому я попросил помощь зала, поскольку в голову никогда не приходило страдать такими вопросами.
21 май 19, 22:44    [21890099]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
stenford
если у тебя постоянно используется ref/out/Tuple в коде - то точно что-то не то в консерватории, скорее всего очень непродуманная структура кода и классов, методы делающие и возвращающие несвязанные вещи.
В консерватории очень много чего не так. Например, провайдер данных может зависеть от потребителя.)
Не я эту консерваторию запиливал.

И "постоянство" тут относительное. Я использую сабж редко, но каждый раз, как использую, получаю замечание и требование переписать. Иногда переписываю, иногда отстаиваю ref/out, если вижу, что альтернативные варианты чреваты кучей декоративного говнокода, который даже не будет повторно использован.
stenford
Такой код невозможно нормально читать и сопровождать.
Некоторые куски я переписываю декларативно на linq, даже не пытаясь разобраться, как исходное говно работает.
21 май 19, 23:01    [21890108]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
ViPRos
Member

Откуда:
Сообщений: 9560
Antonariy
... на linq, даже не пытаясь разобраться, как исходное говно работает.

лучше чем linq - стопудово
22 май 19, 00:19    [21890139]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ViPRos
лучше чем linq - стопудово

О, вот и некрофилия подтянулась. Дженерики - порождение диавола. Самому не смешно, в 2019 году-то?
22 май 19, 00:40    [21890148]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
ViPRos
Member

Откуда:
Сообщений: 9560
fkthat
ViPRos
лучше чем linq - стопудово

О, вот и некрофилия подтянулась. Дженерики - порождение диавола. Самому не смешно, в 2019 году-то?

когда пишешь всякую фигню можно и дженерики
приходи лет через 20
22 май 19, 01:10    [21890154]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ViPRos
приходи лет через 20

Послушать, как ты будешь тут спрашивать про миграцию с фокспро 2.6 на 6.0?
22 май 19, 01:28    [21890158]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
ViPRos
Antonariy
... на linq, даже не пытаясь разобраться, как исходное говно работает.

лучше чем linq - стопудово
"лучше" - характеристика качественная, ничего не говорящая о предмете конкретно.

решения с linq обычно работают медленнее, но они втрое-вчетверо меньше по объему и во столько же более читаемее. в том слое, где практикуются такие переписывания, это приемлемо, прозрачность и безглючность кода важнее производительности.
22 май 19, 10:27    [21890349]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Antonariy
решения с linq обычно работают медленнее

В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.
22 май 19, 10:42    [21890378]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
fkthat
Antonariy
решения с linq обычно работают медленнее

В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.
Замедление не от самого linq, а от обвеса, с которым он работает.
22 май 19, 11:21    [21890447]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
А обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает.
22 май 19, 11:24    [21890451]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
fkthat
Antonariy
решения с linq обычно работают медленнее

В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.

В случае LINQ to Objects компиляции лямб нет, если не делать AsQueryable
22 май 19, 11:29    [21890458]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
Antonariy
Замедление не от самого linq, а от обвеса, с которым он работает.

Есть замедление, ибо там сплошной вызов делегатов, хотя с другой стороны ленивые вычисления.
22 май 19, 11:30    [21890461]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
Antonariy
Замедление не от самого linq, а от обвеса, с которым он работает.

Есть замедление, ибо там сплошной вызов делегатов, хотя с другой стороны ленивые вычисления.

Делегат как-то принципиально по-другому вызывается по сравнению с обычным методом?
22 май 19, 11:49    [21890491]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Antonariy
А обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает.


Если с екселем работаешь через COM, то там накладные расходы на его вызовы такие, что все остальное вообще никак влиять не должно.
22 май 19, 11:55    [21890499]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
fkthat
Делегат как-то принципиально по-другому вызывается по сравнению с обычным методом?

Ясен пень
// 		Action action = delegate
		// 		{
		// 			double num = Math.Cos(12.3);
		// 		};
		IL_0003: ldsfld class [mscorlib]System.Action ConsoleApp2.Program/'<>c'::'<>9__1_1'
		// (no C# code)
		IL_0008: dup
		IL_0009: brtrue.s IL_0022

		IL_000b: pop
		IL_000c: ldsfld class ConsoleApp2.Program/'<>c' ConsoleApp2.Program/'<>c'::'<>9'
		IL_0011: ldftn instance void ConsoleApp2.Program/'<>c'::'<Main>b__1_1'()
		IL_0017: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
		IL_001c: dup
		IL_001d: stsfld class [mscorlib]System.Action ConsoleApp2.Program/'<>c'::'<>9__1_1'

		IL_0022: stloc.0
		// action();
		IL_0023: ldloc.0
		IL_0024: callvirt instance void [mscorlib]System.Action::Invoke()

Против
	// <Main>g__InnerFunction|1_0();
		IL_002a: call void ConsoleApp2.Program::'<Main>g__InnerFunction|1_0'()
22 май 19, 12:09    [21890518]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ,

Инструкций больше, это-то и так понятно, но, именно принципиальной разницы, как, например "раннее связывание" и "позднее связывание" тут нет. И там и там метод прямо по указателю вызывается.
22 май 19, 12:43    [21890579]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
fkthat
Antonariy
А обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает.


Если с екселем работаешь через COM, то там накладные расходы на его вызовы такие, что все остальное вообще никак влиять не должно.
А от COM никуда не денешься, виндовый офис имеет его в своем фундаменте. Работаю через NET-обертки ExcelDna+NetOffice, так что добавь еще накладные расходы внутри них. Однако даже их сумма ничто по сравнению с производительностью самих вызываемых методов.

Например, удаление диапазона строк. Удаление одной строки и сотни строк по времени почти одинаково, но если удалять диапазон построчно, то время возрастает в разы, даже если поотключать экселю все обновления и события. Это самый очевидный кейс, и его я оптимизирую, если натыкаюсь на построчное удаление, а самый распространенный - атомарная операция присвоения массива диапазону, и тут местами приходится разоптимизировать. Метод, создающий массив, обычно имеет кучу параметров, определяющих его внешний вид и размер, данные для массива разнородные, полет мысли авторов, собирающих эти данные в кучу, неописуем. В результате имеем кучу нечитаемых методов, непригодных для повторного использования - грубо говоря, в новом методе массив формируется новым способом, и здесь правят бал Tuple<>. Приходится дробить атомарную операцию на осмысленные куски (которые возможно повторно использовать в других методах), выводя кусками и массив, и это основная причина проседания производительности. Но терпимая.
22 май 19, 14:12    [21890760]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72765
fkthat
ЕвгенийВ,

Инструкций больше, это-то и так понятно, но, именно принципиальной разницы, как, например "раннее связывание" и "позднее связывание" тут нет. И там и там метод прямо по указателю вызывается.
так-то ранее связывание отличается от позднего тем, что во втором как раз и есть больше инструкций, занимающимися тем, чем при раннем связывании занимается компилятор - определением адреса вызываемого метода)
22 май 19, 14:20    [21890777]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Antonariy,
У вас проблема вроде не в скорости была).
22 май 19, 15:29    [21890887]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3404
в Linq почти все вызовы больше O(n), так как последовательность IEnumerabl<T> не упорядочена, не имеет фиксированного размера, нет предоставляет прямой доступ по индексу к элементам последовательности, что делает невозможным применение более быстрых алгоритмов логарифмической сложности O(logn) и константного время доступа к элементам последовательности.
Время материализации постоянно O(c) для всех случаев, им можно пренебречь, ведь и для обычных массивов и для IEnumerable<T> данные в любом случае придется загрузить.
Массив в отличии от последовательности, это непрерывная область в памяти фиксированной длинны, то есть вероятность того, что весь массив или его часть окажется закэширован выше, чем в случае с последовательностью, ведь не факт, что за кулисами массив. И в момент обращения к первому элементу, 2 вообще еще существует.

Linq и последовательности, по очевидным причинам удобнее, лаконичнее, короче, нагляднее и выразительнее, чем работа с более низкоуровневыми типами. А концепция методов расширения позволяет расширить её и добавить сколько угодно новых методов.

За собой замечаю, что все больше отдаю предпочтение массивам T[], особенно если последовательность имеет фиксированный размер и важен доступ через индексатор.

Оптимизация нужна не всегда и не везде. Нет смысла городить сложные алгоритмы поиска в наборе из 100 записей, при реализации функционала если задача выполняется за разумное\требуемое время, нет смысла делать её быстрее.
22 май 19, 17:00    [21891009]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Roman Mejtes,

В Linq многие методы оптимизированы за счет того, что они сначала смотрят, что на самом деле лежит под IEnumerable и для "знакомых" им коллекций вызывают соответствующие "быстрые" методы или свойства. Поясню на примере:
new [] {1, 2, 3, 4}.Count()

В этом случае Сount() распознает, что в него передали массив и не станет просто перебирать его элементы и подстчитывать, а сразу вернет свойство Length.
22 май 19, 17:37    [21891061]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
ЕвгенийВ
В случае LINQ to Objects компиляции лямб нет, если не делать AsQueryable

Да, посмотрел - там блямбда преобразуется в делегат уже самим компилятором.
22 май 19, 17:39    [21891066]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3404
fkthat
Roman Mejtes,

В Linq многие методы оптимизированы за счет того, что они сначала смотрят, что на самом деле лежит под IEnumerable и для "знакомых" им коллекций вызывают соответствующие "быстрые" методы или свойства. Поясню на примере:
new [] {1, 2, 3, 4}.Count()

В этом случае Сount() распознает, что в него передали массив и не станет просто перебирать его элементы и подстчитываеть, а сразу вернет свойство Length.

Ваш пример, это наилучший результат выполнения метода, подобный тому, если бы N было равно 0 или 1, размер коллекции мы бы получили немедленно, практически за константное время. Но при оптимизации рассматривают наихудший из возможных сценариев, а не наилучший. В худшем из сценариев, данный метод может занимать огромное количество времени.
22 май 19, 18:05    [21891097]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
fkthat
Member

Откуда:
Сообщений: 1163
Antonariy
так-то ранее связывание отличается от позднего тем, что во втором как раз и есть больше инструкций, занимающимися тем, чем при раннем связывании занимается компилятор - определением адреса вызываемого метода)

Ну так если рассуждать, то вообще ничего от ничего не отличается. MS Office отличается от SQL Server только количеством и порядком инструкций.
22 май 19, 18:06    [21891098]     Ответить | Цитировать Сообщить модератору
 Re: ref и out параметры  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4748
Roman Mejtes
Ваш пример, это наилучший результат выполнения метода, подобный тому, если бы N было равно 0 или 1, размер коллекции мы бы получили немедленно, практически за константное время. Но при оптимизации рассматривают наихудший из возможных сценариев, а не наилучший. В худшем из сценариев, данный метод может занимать огромное количество времени.

public static int Count<TSource>(this IEnumerable<TSource> source)
{
	if (source == null)
	{
		throw Error.ArgumentNull("source");
	}
	ICollection<TSource> collection = source as ICollection<TSource>;
	if (collection != null)
	{
		return collection.Count;
	}
	ICollection collection2 = source as ICollection;
	if (collection2 != null)
	{
		return collection2.Count;
	}
	int num = 0;
	using (IEnumerator<TSource> enumerator = source.GetEnumerator())
	{
		while (enumerator.MoveNext())
		{
			num = checked(num + 1);
		}
		return num;
	}
}
22 май 19, 18:18    [21891108]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить