powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ref и out параметры
25 сообщений из 120, страница 4 из 5
ref и out параметры
    #39816055
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никакой код с реф/аут отбракован не был, его утвердил тимлид.
Сабж не любит напарник, ревьюят оба.
Напарник внятно объяснить свою нелюбовь не смог, поэтому я попросил помощь зала, поскольку в голову никогда не приходило страдать такими вопросами.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816063
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenfordесли у тебя постоянно используется ref/out/Tuple в коде - то точно что-то не то в консерватории, скорее всего очень непродуманная структура кода и классов, методы делающие и возвращающие несвязанные вещи.В консерватории очень много чего не так. Например, провайдер данных может зависеть от потребителя.)
Не я эту консерваторию запиливал.

И "постоянство" тут относительное. Я использую сабж редко, но каждый раз, как использую, получаю замечание и требование переписать. Иногда переписываю, иногда отстаиваю ref/out, если вижу, что альтернативные варианты чреваты кучей декоративного говнокода, который даже не будет повторно использован.
stenfordТакой код невозможно нормально читать и сопровождать.Некоторые куски я переписываю декларативно на linq, даже не пытаясь разобраться, как исходное говно работает.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816087
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy... на linq, даже не пытаясь разобраться, как исходное говно работает.
лучше чем linq - стопудово
...
Рейтинг: 0 / 0
ref и out параметры
    #39816095
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosлучше чем linq - стопудово
О, вот и некрофилия подтянулась. Дженерики - порождение диавола. Самому не смешно, в 2019 году-то?
...
Рейтинг: 0 / 0
ref и out параметры
    #39816100
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatViPRosлучше чем linq - стопудово
О, вот и некрофилия подтянулась. Дженерики - порождение диавола. Самому не смешно, в 2019 году-то?
когда пишешь всякую фигню можно и дженерики
приходи лет через 20
...
Рейтинг: 0 / 0
ref и out параметры
    #39816104
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosприходи лет через 20
Послушать, как ты будешь тут спрашивать про миграцию с фокспро 2.6 на 6.0?
...
Рейтинг: 0 / 0
ref и out параметры
    #39816228
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosAntonariy... на linq, даже не пытаясь разобраться, как исходное говно работает.
лучше чем linq - стопудово"лучше" - характеристика качественная, ничего не говорящая о предмете конкретно.

решения с linq обычно работают медленнее, но они втрое-вчетверо меньше по объему и во столько же более читаемее. в том слое, где практикуются такие переписывания, это приемлемо, прозрачность и безглючность кода важнее производительности.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816243
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyрешения с linq обычно работают медленнее
В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816277
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatAntonariyрешения с linq обычно работают медленнее
В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.Замедление не от самого linq, а от обвеса, с которым он работает.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816281
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816286
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatAntonariyрешения с linq обычно работают медленнее
В общем-то, только из-за доп. расходов на компиляцию лямбд (я и тут даже не уверен, м.б. в случае LINQ to Objects это уже компилятор заранее делает - надо будет декомпилятором как-нибудь посмотреть) - других причин я придумать не могу - внутри будет такой же foreach.
В случае LINQ to Objects компиляции лямб нет, если не делать AsQueryable
...
Рейтинг: 0 / 0
ref и out параметры
    #39816289
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЗамедление не от самого linq, а от обвеса, с которым он работает.
Есть замедление, ибо там сплошной вызов делегатов, хотя с другой стороны ленивые вычисления.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816307
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВAntonariyЗамедление не от самого linq, а от обвеса, с которым он работает.
Есть замедление, ибо там сплошной вызов делегатов, хотя с другой стороны ленивые вычисления.
Делегат как-то принципиально по-другому вызывается по сравнению с обычным методом?
...
Рейтинг: 0 / 0
ref и out параметры
    #39816313
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает.

Если с екселем работаешь через COM, то там накладные расходы на его вызовы такие, что все остальное вообще никак влиять не должно.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816324
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatДелегат как-то принципиально по-другому вызывается по сравнению с обычным методом?
Ясен пень
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// 		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()


Против
Код: c#
1.
2.
	// <Main>g__InnerFunction|1_0();
		IL_002a: call void ConsoleApp2.Program::'<Main>g__InnerFunction|1_0'()
...
Рейтинг: 0 / 0
ref и out параметры
    #39816365
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ,

Инструкций больше, это-то и так понятно, но, именно принципиальной разницы, как, например "раннее связывание" и "позднее связывание" тут нет. И там и там метод прямо по указателю вызывается.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816492
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatAntonariyА обвес работает с экселем) Поэтому шаг влево, шаг вправо от идеального по быстродействию способа - и эксель провисает.

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

Например, удаление диапазона строк. Удаление одной строки и сотни строк по времени почти одинаково, но если удалять диапазон построчно, то время возрастает в разы, даже если поотключать экселю все обновления и события. Это самый очевидный кейс, и его я оптимизирую, если натыкаюсь на построчное удаление, а самый распространенный - атомарная операция присвоения массива диапазону, и тут местами приходится разоптимизировать. Метод, создающий массив, обычно имеет кучу параметров, определяющих его внешний вид и размер, данные для массива разнородные, полет мысли авторов, собирающих эти данные в кучу, неописуем. В результате имеем кучу нечитаемых методов, непригодных для повторного использования - грубо говоря, в новом методе массив формируется новым способом, и здесь правят бал Tuple<>. Приходится дробить атомарную операцию на осмысленные куски (которые возможно повторно использовать в других методах), выводя кусками и массив, и это основная причина проседания производительности. Но терпимая.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816498
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЕвгенийВ,

Инструкций больше, это-то и так понятно, но, именно принципиальной разницы, как, например "раннее связывание" и "позднее связывание" тут нет. И там и там метод прямо по указателю вызывается.так-то ранее связывание отличается от позднего тем, что во втором как раз и есть больше инструкций, занимающимися тем, чем при раннем связывании занимается компилятор - определением адреса вызываемого метода)
...
Рейтинг: 0 / 0
ref и out параметры
    #39816585
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
У вас проблема вроде не в скорости была).
...
Рейтинг: 0 / 0
ref и out параметры
    #39816662
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в Linq почти все вызовы больше O(n), так как последовательность IEnumerabl<T> не упорядочена, не имеет фиксированного размера, нет предоставляет прямой доступ по индексу к элементам последовательности, что делает невозможным применение более быстрых алгоритмов логарифмической сложности O(logn) и константного время доступа к элементам последовательности.
Время материализации постоянно O(c) для всех случаев, им можно пренебречь, ведь и для обычных массивов и для IEnumerable<T> данные в любом случае придется загрузить.
Массив в отличии от последовательности, это непрерывная область в памяти фиксированной длинны, то есть вероятность того, что весь массив или его часть окажется закэширован выше, чем в случае с последовательностью, ведь не факт, что за кулисами массив. И в момент обращения к первому элементу, 2 вообще еще существует.

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

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

Оптимизация нужна не всегда и не везде. Нет смысла городить сложные алгоритмы поиска в наборе из 100 записей, при реализации функционала если задача выполняется за разумное\требуемое время, нет смысла делать её быстрее.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816683
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

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


В этом случае Сount() распознает, что в него передали массив и не станет просто перебирать его элементы и подстчитывать, а сразу вернет свойство Length.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816686
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВВ случае LINQ to Objects компиляции лямб нет, если не делать AsQueryable
Да, посмотрел - там блямбда преобразуется в делегат уже самим компилятором.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816704
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatRoman Mejtes,

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


В этом случае Сount() распознает, что в него передали массив и не станет просто перебирать его элементы и подстчитываеть, а сразу вернет свойство Length.
Ваш пример, это наилучший результат выполнения метода, подобный тому, если бы N было равно 0 или 1, размер коллекции мы бы получили немедленно, практически за константное время. Но при оптимизации рассматривают наихудший из возможных сценариев, а не наилучший. В худшем из сценариев, данный метод может занимать огромное количество времени.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816705
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyтак-то ранее связывание отличается от позднего тем, что во втором как раз и есть больше инструкций, занимающимися тем, чем при раннем связывании занимается компилятор - определением адреса вызываемого метода)
Ну так если рассуждать, то вообще ничего от ничего не отличается. MS Office отличается от SQL Server только количеством и порядком инструкций.
...
Рейтинг: 0 / 0
ref и out параметры
    #39816713
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
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;
	}
}
...
Рейтинг: 0 / 0
25 сообщений из 120, страница 4 из 5
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / ref и out параметры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]