Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242

Быстродействие linq

21.06.2019, 13:24. Показов 3383. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть в Linq что-то, что работает быстрее, нежели самому писать foreach и выбирать нужные элементы и т.д.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2019, 13:24
Ответы с готовыми решениями:

Литература по EntityFramework, WCF, Linq to Objects, и Linq to SQL
Посоветуйте пожалуйста книги или статьи для освоения следующих вещей: EntityFramework, WCF, Linq to Objects, и Linq to SQL Google...

Не удаётся неявно преобразовать тип System.Linq.IQueryable<<anonymous type>> в System.Linq.IQueryable<Character>
Здравствуйте. Решили добавить навигацию на страницу и где-то допустили ошибку. Помогите пожалуйста разобраться. Запрос public...

Быстродействие потока, Invoke
добрый день, задача следующая, обрабатываю изображение, что бы форма не зависала, делаю в отдельном потоке. И я заметил что в новом потоке...

25
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
22.06.2019, 00:45  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от КОП Посмотреть сообщение
которая лично для меня ускоряет понимание кода
Я же это не оспаривал. Спрашивал:
Цитата Сообщение от Passerby Посмотреть сообщение
Как считаете, проигрыш linq в быстродействии это временно и пройдет с оптимизацией компилятора или что-то в linq есть принципиальное, что не позволит достичь сравнимого быстродействия никогда?
Из ответа выше, вероятно, что это навсегда, ибо потокобезопасная ленивая инициализация. На рисунке, который прислал, видно, что для этого кода линк почти в 20 раз медленнее. Может сделают еще версию linq для однопоточных приложений и компилятор будет определять какую делать реализацию?
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.06.2019, 00:54
Цитата Сообщение от Passerby Посмотреть сообщение
Я же это не оспаривал. Спрашивал:
я цитатой выделил фразу, на которую отвечал. к указанной вами цитате она не имела отношения
Цитата Сообщение от Passerby Посмотреть сообщение
Из ответа выше, вероятно, что это навсегда, ибо потокобезопасная ленивая инициализация.
потокобезопасная ленивая инициализация это из другой темы, линк про ленивые вычисления.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.06.2019, 01:29
Цитата Сообщение от Passerby Посмотреть сообщение
Я же это не оспаривал. Спрашивал:
Цитата Сообщение от Passerby Посмотреть сообщение
Как считаете, проигрыш linq в быстродействии это временно и пройдет с оптимизацией компилятора или что-то в linq есть принципиальное, что не позволит достичь сравнимого быстродействия никогда?
LINQ всегда будет медленнее. Так как это обобщённые методы расширения и под оболочкой там те же циклы. То есть прямое применение циклов как минимум всегда будет быстрее на время работы оболочки.
Плюс к этому (иногда) ещё некоторое замедленнее связанное с работой с обобщённом типом, а не конкретным.
То есть на практике несколько методов LINQ приходится выстраивать в цепочку, а в коде порой это же самое можно сделать в одном цикле или в меньшем количестве циклов.

Пример получения из массива стринг чисел с проверкой на преобразование.

C#
1
2
3
4
5
6
7
8
9
10
string[] arr = {"1", "h", "gg", "-9", /* дальше строки */};
 
/// LINQ - три перебора последовательности
var numers = arr.Where(st => int.TryParse(st, out int _tmp)).Select(int.Parse).ToList();
 
/// То же самое в один перебор последовательности
List<int> nums = new List<int>();
   foreach(string str in arr)
      if (int.TryParse(str, out int num))
           nums.Add(num);
Цитата Сообщение от Passerby Посмотреть сообщение
Может сделают еще версию linq для однопоточных приложений и компилятор будет определять какую делать реализацию?
Маловероятно. Так как это методы расширения и они не знают, в принципе, сколько потоков используется в приложении в целом. Поэтому "во внутренностях" они всегда будут однопоточными и разрешение конфликтов с потоками оставят на внешнюю реализацию.

Программист знает когда можно применить многопотчность с последовательности, а когда нет. Для этого нужны знания выходящие за рамки самой последовательности. LINQ же работает только с самой последовательностью.
0
-7 / 3 / 1
Регистрация: 22.09.2017
Сообщений: 242
22.06.2019, 01:42  [ТС]
Велика ли разница в вашем коде?
C#
1
2
3
4
5
/// LINQ - три перебора последовательности
var numers = arr.Where(st => int.TryParse(st, out int _tmp)).Select(int.Parse).ToList();
 
/// То же самое в один перебор последовательности
List<int> nums = new List<int>(); foreach (var st in arr)if (int.TryParse(st, out int num))nums.Add(num);
А если сделают вместо new List<int>(); только new, то разница будет символа 3.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
22.06.2019, 01:57
Цитата Сообщение от Passerby Посмотреть сообщение
Велика ли разница в вашем коде?
Если в быстродействии (для чего я и сделал пример), то при крайнем случае будет около трёх раз.

Если в длине (посимвольной) кода, то в этом случае преимущество, хоть и маленькое, но на стороне LINQ. Но это, как Вы справедливо заметили, в этом случае не принципиально.

Принципиально другое. При наличии опыта строка с LINQ читается "слёту", практически не задумываясь. То есть код LINQ прозрачен и удобочитаем.

А при использовании одного цикла для трёх операций приходится прилагать усилия (умственные) для понимания смысла этого цикла. И по мере усложнения обработки это понимание будет усложняться и усложняться.


Я сам начинающий. Изучать C# начал меньше года назад. По началу всё делал "по старинке" на циклах. Но потом, когда появился опыт, в том числе связанный с модернизацией своего прошлого кода, рефакторингом чужого кода, с одной стороны стал "читать слёту" LINQ, с другой понял что прирост в скорости обычных циклов в 99,99% случаев не нужен и на практике незаметен. Поэтому сейчас, в большинстве случаев использую LINQ.
0
22.06.2019, 02:00

Не по теме:

Цитата Сообщение от Passerby Посмотреть сообщение
только new, то разница будет символа 3.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Принципиально другое.
кто-то сравнивает самолеты по весу, кто-то по дизайну, кто-то по безопасности, а кто-то по прибыли

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2019, 02:00

Оптимизировать программу, быстродействие
У меня есть 2 программы - две части одной системы. Из одной программы в другую поступают данные через блокнот. Поэтому в моих интересах,...

Телесуфлер - увеличить быстродействие программы
Доброго времени суток! Сразу предупреждаю, что не разрабатывал крупных десктоп-приложений, извините, если задаю глупые вопросы. Да и полный...

Как увеличить быстродействие сравнения элементов класса?
Есть два класса Helper и FileDB. Я создал также два списка List&lt;FileDB&gt; listFileDB = new List&lt;FileDB&gt;(); List&lt;Helper&gt; listHelper...

Проверить быстродействие алгоритмов деления и суммы чисел на C#
Проверить быстродействия алгоритмов деления и сумму чисел. Алгоритмы деления и суммы должны иметь циклы, чтобы узнать разницу времени...

Повышает ли readonly быстродействие или это слово только для предупреждения ошибок?
Повышает ли readonly быстродействие или это слово только для предупреждения ошибок, т.к. предотвращает изменение поля?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru