Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149

Что быстрее Цикл или коллекция

17.04.2019, 08:56. Показов 2220. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе утро!) Ребят подскажите, кто в курсе какой вариант алгоритма будет работать быстрее


Вариант с перебором 2-м циклом одной и тойже коллекции с проверкой внутри
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void ConvertToOrg()
        {
            foreach (Department2 department in Departments)
            {
                foreach (Department2 department2 in Departments)
                {
                    if (department.ParentID == department2.ID) department.Parent = department2;
                    if (department.ID == department2.ParentID) department.Children.Add(department2);
                }
            }
 
        }
Или же вариант с одним циклом и LINQ для работы с коллекцией

C#
1
2
3
4
5
6
7
8
9
private void ConvertToOrg()
        {
            foreach (Department2 department in Departments)
            {
                department.Parent = Departments.Where(p => p.ID = department.ID).First();
                department.Children = Departments.Where(p => p.ParentID = department.ID); 
                //Children имеет тип ObservableCollection так же как и Departments
            }
        }
Я б сам потестил скорость работы но большого объема данных под рукой нет а на маленьком кол-ве разницы нет...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2019, 08:56
Ответы с готовыми решениями:

Оптимизация кода, структуры базы, или что еще можно сделать что бы быстрее работало!?
Всем привет! Господа, выручайте. Не пойму как еще оптимизировать... Есть куча связанных таблиц. Нужно выводить статистику используя...

if или switch? что быстрее
Здравствуйте. Подскажите пожалуйста,что быстрее будет выполняться много условий if ,или switch int z = 5; if (z==4) z= 3; if...

Что быстрее - метод или свойство?
private static int ReadTime { get { var buffer = new byte; int...

24
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
17.04.2019, 09:50
Цитата Сообщение от Stas9700 Посмотреть сообщение
какой вариант алгоритма будет работать быстрее
LINQ медленнее foreach'а примерно раз в 10

Добавлено через 47 секунд
PS. а for еще быстрее работает
1
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
17.04.2019, 09:57  [ТС]
asn31337, Оу ,спасибо. Я понимал что LINQ помедленнее, но чтоб настолько...... Это мне теперь что и конструкцию
C#
1
Departments.Where(p => p.ParentID = department.ID);
чтоль на циклы переписать ахахах))
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
17.04.2019, 09:57
Stas9700, В большинстве случаев LINQ будет немного медленнее, потому что он вводит накладные расходы. Не используйте LINQ, если для вас важна производительность.LINQ используется для более удобного чтения и поддержки кода.
Вы всегда можете замерить производительность, воспользовавшись классом Stopwatch, но не забывайте, что важно на каком железе тестите, к примеру если у вас топ машина, но у пользователя эти данные могут сильно отличаться ввиду старой машины
C#
1
2
3
Stopwatch s = Stopwatch.StartNew();
            // Ваш код для теста
            Console.WriteLine(s.Elapsed);
1
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
17.04.2019, 10:05  [ТС]
ShmelVG, У меня скорее не то чтобы потребность сделать все молниеносно, просто приложение работает с БД и файлами Excel. И когда я начал использовать доп. библиотеки, вместо подхода "написал запрос и результат циклом переписал в коллекцию", просто офигел от того насколько дольше все работает. То есть функция написанная руками выбирает 3к записей из базы (в каждой 28 столбцов) быстрее чем entity framework просто 3 записи (если это конечно первое подключение к БД). И вот из за таких моментов, я стараюсь в вещах где можно сделать без примочек, делать самомму чтоб общая скорость не так сильно падала)
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
17.04.2019, 10:06
Цитата Сообщение от Stas9700 Посмотреть сообщение
чтоль на циклы переписать
Если количество элементов коллекции не исчисляется миллионами и более, то особого смысла нет. Думаю, несколько десятков миллисекунд Вам погоды особой не сделает )))
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 10:06
Цитата Сообщение от Stas9700 Посмотреть сообщение
какой вариант алгоритма будет работать быстрее
Оба будут работать медленнее, потому что везде O(n2)
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
17.04.2019, 10:07  [ТС]
kolorotur, А как тогда делать?
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
17.04.2019, 10:09
причем тут Linq он незначительные расходы накладывает главное понимания как работает сама функция

в 1 варианте 2 цикла, а во 2 варианте 3 цикла
3 цикла будит дольше выполнятся чем 2

foreach и for не думаю что большая разница будит при одинаковых условиях
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
17.04.2019, 10:10
Stas9700, для большей производительности можете использовать ADO.NET вместо EF
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
17.04.2019, 10:12
Цитата Сообщение от Stas9700 Посмотреть сообщение
приложение работает с БД и файлами Excel
работа с Excel довольно тормознутая. От этого, к сожалению, никуда не деться. Только если не использовать его))) Если используете Interop.Excel, попробуйте подключаться к Excel'ю через OleDb. Вроде бы так должно побыстрее работать. (Хотя поручиться не могу, сам не пробовал). Ну и выносите длительные операции в асинхронные методы.
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
17.04.2019, 10:17  [ТС]
ShmelVG, ShmelVG, Согласен, на прошлом проекте его и юзал. Но разве ADO.NET не сложнее в реализации базовых операций и отслеживания изменений в элементах его коллекции типа DtSet, если я правильно помню?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 10:18
Цитата Сообщение от Stas9700 Посмотреть сообщение
А как тогда делать?
Ну если не хотите использовать ORM, то хотя бы оптимизируйте алгоритм.
Например, через Join:
C#
1
2
3
4
5
6
7
8
9
10
var query = 
from parent in Departments
join child in Departments on parent.ID equals child.ParentID
select (parent, child);
 
foreach (var (parent, child) in query)
{
   parent.Children.Add(child);
   child.Parent = parent;
}
Уже O(2n)
0
 Аватар для Wolflind
127 / 107 / 31
Регистрация: 17.03.2016
Сообщений: 445
Записей в блоге: 1
17.04.2019, 10:24
По мне так лучше вынести это в SQL функцию и вызывать ее
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
17.04.2019, 10:25
Stas9700, EF - по большому счету удобство для программиста, хотя они его активно развивают) Всё зависит от самого приложения в целом, если у вас огромная БД и частые запросы, стоит подумать на счёт ado, конечно же в ущерб удобству)
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
17.04.2019, 10:28
Цитата Сообщение от Wolflind Посмотреть сообщение
foreach и for не думаю что большая разница будит при одинаковых условиях
Разница незначительная, но она есть.
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
17.04.2019, 10:28  [ТС]
asn31337, ну вот собственно я все чтение из файла в коллекцию закинул в отдельный поток и меня устраивает. насчет Oledb что то читал в связке с эксель, но маловато поэтому лучше пока не буду трогать))
0
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
17.04.2019, 10:30
Цитата Сообщение от Stas9700 Посмотреть сообщение
насчет Oledb что то читал в связке с эксель, но маловато
Ну вот я тоже где то краем уха слышал, что так можно, но сам не пробовал и в тему не углублялся. Поэтому что то конкретное сказать или посоветовать тут не могу.
0
1 / 1 / 2
Регистрация: 18.12.2018
Сообщений: 149
17.04.2019, 10:44  [ТС]
ShmelVG, БД пока нулевая ахахах, все делается с нуля. Теоретически записей будет много и одновременно как бы нет. Условно клиентов много, но каждый клиент занимать места в БД будет не прям так дофига. Да и сроки на разработки поджимают, поэтому важнее скорость разработки. Над скоростью работы меня больше собственные тараканы в голове заставляют париться)

Добавлено через 11 минут
kolorotur, Так а вот тут хотелось бы по подробнее...
Какой результат будет после объедения? что-то типа:

Родитель | Ребенок
1 |
2 |
3 | 1
3 | 2

И дальше вы проходитесь по получившемуся набору и записываете ссылки друг на друга? Или как то я не так понял...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
17.04.2019, 10:47
Цитата Сообщение от Stas9700 Посмотреть сообщение
Какой результат будет после объедения?
Дык запустите и посмотрите, делов-то.

Вкратце: будут выбраны пары элементов, у которых совпадают значения ID и ParentID, а потом будет привязка главной записи к дочерней и дочерней к главной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2019, 10:47
Помогаю со студенческими работами здесь

Что быстрее умножение или деление?
Что быстрее выполнится: большое число*небольшое или 1/большое число? Большие числа приблизительно одинаковы Небольшое - число от 5 до...

Поиск элемента в массиве или ключа в хеше - что быстрее
Что будет быстрее работать: поиск элемента в массиве или ключа в словаре/хеше?

Что будет быстрее и рентабельние использовать XML или Sqlite?
Задача следующая: Получаю массив строк, и нужно узнать если ли каждая из этих строк в моей базе. Так вот что лучше мне подойдет для такой...

Обращение через индекс Dictionary или IndexOf, что быстрее / производительнее?
Смотрите есть строка: string dic = "abcdefghijklmnopqrstuvwxyz"; мне приходит символ (char) и мне надо выяснить положение этого...

Что быстрее switch(enum) или if else?
Может кто нибудь знает,какая конструкция лучше в плане производительности: 1) enum e{one, two, three}; switch (e) { case.. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. fontSize": 18, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations":. . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru