@dualdeazz

Как можно сделать перебор по массиву быстрее?

Перебираю вложенный массив таким образом, как можно сделать быстрее?

var someItems= _someService.GetList();
            foreach( var item in someItems)
            {
                var additionalItems = _additionItemsSerivce.GetList();
                foreach (var additionalItem in additionalItems )
                {
                    var properties = additionalItem.Properties;
                    foreach (var property in properties )
                    {
                        property.First= true;
                        property.First= true;
                        _additionItemsSerivce.UpdateProperies(additionalItem);
                    }
                }
            }
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
Если радикально не переписывать - никак.
Если перейти на Span, как ты рядом советуют - получишь выигрыш в пару процентов.

У тебя основное замедление происходит из-за того что:
1. На каждый someItem ты делаешь вызов _additionItemsSerivce
2. На каждый property ты делаешь вызов UpdateProperties

Тебе следует в первую очередь переписать код так, чтобы уменьшить количество этих вызовов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
mayton2019
@mayton2019
Bigdata Engineer
Надо посмотреть в суть вопроса. Откуда вообще он идет. Очень часто программисты оптимизируют не то и не там. Иногда они оптимизируют "от нечего" делать. Или от предубеждений что каждый цикл надо оптимизировать.

Что по поводу этого куска кода думает бизнес? Его это беспокоит? Действительно ли этот кусов влияет на какую-то внешнюю оценку. Может он работает в составе джоба и занимает 1% времени?

Откуда вообще возникает list? Если из базы данных - то возникает вопрос. Можно ли сделать UPDATE прямо в базе данных без пере-сохранения в объекты.

Если надо только в объектах и если накладные расходы идут на объекты - то можно попробовать развернуть объекты на 90 градусов и сделать из них массивы примитивов. По ним поиск пойдет быстрее. Но такой подход
специфичен для bigdata, где есть WORM (Write Once Read Many). И нужно еще доказать что разворачивание объектов даст в итоге полезный эффект ведь накладные на сам процесс разворачивания никто не отменял.
Ответ написан
Комментировать
WNeZRoS
@WNeZRoS
Если было бы больше контекста, то можно было бы что-то увереннее советовать. По этому куску кода можно дать только такие комментарии (считая что Get* методы и итераторы не имеют сайд эффектов):
var someItems = _someService.GetList();
foreach (var item in someItems) // item внутри не используется, можно убрать этот foreach
{
    var additionalItems = _additionItemsSerivce.GetList();
    foreach (var additionalItem in additionalItems)
    {
        var properties = additionalItem.Properties;
        foreach (var property in properties)
        {
            property.First = true;
            property.First = true; // зачем делать одно и тоже два раза?
            _additionItemsSerivce.UpdateProperies(additionalItem); // property не используется, значит можно вынести за этот foreach
        }
    }
}


Если по этим комментариям убрать лишнее, получится что-то такое:
var additionalItems = _additionItemsSerivce.GetList();
foreach (var additionalItem in additionalItems)
{
    var properties = additionalItem.Properties;
    foreach (var property in properties)
        property.First = true;
    
    _additionItemsSerivce.UpdateProperies(additionalItem);
}


Так же странно что все проперти у вас получают флаг First, возможно вместо foreach по properties стоит получить только первый элемент и ему установить First = true.
Ответ написан
Комментировать
freeExec
@freeExec
Участник OpenStreetMap
Выкинуть ООП, перейти на линейные массивы примитивных типов.
Ответ написан
@OwDafuq
Ответ написан
Комментировать
@Ilay_Developer
Переписать циклы на параллельный / асинхронный вариант. По возможности избавиться от вложенных циклов, так это более долгий алгоритм.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы