Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
214 / 148 / 48
Регистрация: 28.12.2016
Сообщений: 716
1

Linq или не Linq. Linq медленней стандартных методов?

28.05.2017, 06:42. Показов 1468. Ответов 6
Метки нет (Все метки)

Есть у нас два массива, нужно найти совпадения в первом из второго. Два варианта реализации, первый костылем, второй с linq, но скорость выполнения получается меньше. Linq тормознутый? Получается если для тебя важна производительность, то стоит отказаться от Linq?

Совпадает только Four

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
string[] temp1 = {"One","Two","Three","Four","Five" };
string[] temp2 = {"Six","Four","Ten"};
 private void button1_Click(object sender, EventArgs e)
        {
            // Первое выполнение получаем 671, последующие 3
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Search1();
            sw.Stop();
            MessageBox.Show(sw.ElapsedTicks + "");
        }
 private void button2_Click(object sender, EventArgs e)
        {
            // Первое выполнение получаем 3086, последующие 10
            Stopwatch sw = new Stopwatch();
            sw.Start();
            Search2();
            sw.Stop();
            MessageBox.Show(sw.ElapsedTicks + "");
        }
private bool Search1()
        {
            foreach (var item1 in temp1)
            {
                foreach (var item2 in temp2)
                {
                    if (item2 == item1)
                        return true;
                }
            }
            return false;
        }
private bool Search2()
        {
             return temp1.Any(item1 => temp2.Any(item2 => item2 == item1));
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.05.2017, 06:42
Ответы с готовыми решениями:

LINQ to Interbase/Firebird и вообще LINQ to...
Возникла вот надобность работы с СУБД Interbase. Очень хочется пользоваться удобными средствами...

LINQ это выход или нет
Мне поставили задачу - реализовать некоторые механизмы взаимодействия между Windows Form (C#) и...

Где выполняется запрос LINQ: в БД или памяти?
Добрый день. Хочу прояснить для себя следующий момент, помогите, пожалуйста. Работаю с EF и Code...

Что лучше для c#? Linq или ADO.NET
В чем преимущества одного перед другим при работе на C#, посоветуйте пож-та книги Добавлено...

6
Эксперт .NETАвтор FAQ
9856 / 4810 / 1731
Регистрация: 11.01.2015
Сообщений: 5,991
Записей в блоге: 34
28.05.2017, 08:44 2
Defences,
1) LINQ не может быть быстрее "обычных" циклов. Потому что он является просто надстройкой над этими циклами. При этом он еще имеет некоторый оверхед, так что да, он медленнее.
2) Задачу вы решаете неправильно. У вас алгоритм O(n^2). Используйте Hashset и будет O(n).
1
214 / 148 / 48
Регистрация: 28.12.2016
Сообщений: 716
28.05.2017, 09:03  [ТС] 3
Storm23, спасибо, не совсем понял про HashSet, можно подробней?
0
4701 / 3245 / 1375
Регистрация: 09.05.2015
Сообщений: 7,958
28.05.2017, 09:26 4
Он имеет в виду использовать вместо массива HashSet<T>. Т.к. там поиск осуществляется без перебора всех элементов, то соответственно он намного быстрее.
2
Почетный модератор
Эксперт С++
5843 / 2852 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
29.05.2017, 15:55 5
Немного цифр:
https://habrahabr.ru/post/192130/
https://habrahabr.ru/post/210616/
0
433 / 298 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
30.05.2017, 22:57 6
не надо зацикливаться так на скорости.
Порой читаемость и простота поддерживания кода куда важнее чем +10% производительности в цикле.
0
869 / 658 / 214
Регистрация: 30.04.2009
Сообщений: 2,747
31.05.2017, 02:19 7
В Linq делается все то же самое, разве что минимальный оверхед на вызовы функций.
Есть более эффективный способ для решения данной конкретной задачи с помощью Linq
C#
1
temp1.Intersect(temp2).Any();
Он собственно внутри и использует упомянутый выше HashSet.
Эффективность будет заметна на больших массивах (хотя бы 20 элементов). На маленьких будет наоборот медленнее.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.05.2017, 02:19

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

Чья производительность выше - foreach или Linq
Что быстрее выполнится foreach(var par in outBody.Elements&lt;Paragrph&gt;()) ...

Имя типа или пространства имен linq отсутствует
Делаю простенький билдер. Что делать дает ошибку &quot;имя типа или пространства имен linq отсутствует&quot;...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.