Оптимизация перебора всех элементов Dictionary<T,T>

144
12 марта 2019, 17:20

Есть класс мира, в котором находится словарик форм жизни. Каждый Update в классе мира вызывается foreach, который перебирает все формы жизни и производит с ними некоторые действия(изменение полей ботов, выполнение их методов и т.д.)

Также в цикле foreach может происходить создание новых форм жизни, их удаление и занесение новых в перебираемый словарик(!)

Код вы можете видеть ниже (значительно упрощённый):

public class LifeForm 
{
 // реализация класса формы жизни
}
public class World  
{
     Dictionary<long, LifeForm> LifeForms;
     private void Update()
     {
        foreach (LifeForm bot in LifeForms.Values.ToList())
        {
         // обновление данных бота,создание и добавление новых ботов в наш Dictionary
        }
    }
}

Одна итерация foreach проходит быстро и занимает примерно 1-2мс. Но при 10000+ форм жизни в словарике на его обновление уходит более 5 секунд.

Само по себе обновление словарика в единичной итерации foreach требует очень мало ресурсов, можно ли одновременно обновлять сразу несколько элементов LifeForms? Чем можно заменить классический foreach, чтобы перебор происходил в нескольких потоках?

Parallel.ForEach не даёт желаемого эффекта,с ним работает намного медленнее

READ ALSO
WPF синхронизация коллекций из Model и ViewModel

WPF синхронизация коллекций из Model и ViewModel

разбираюсь в паттерне MVVM, подскажите, как правильно реализовать связь между коллекциями Model и ViewModelДопустим, в Model у меня есть коллекция, которая...

130
Autofac: регистрация типа InstancePerRequest

Autofac: регистрация типа InstancePerRequest

ASPNET WebApi2, контроллер

189
Спавн пули относительно оружия

Спавн пули относительно оружия

Столкнулся с такой проблемой: Есть космический корабль, у него есть дочерние объекты - орудия на нужных позицияхНо пули спавнятся не там где...

170
Событие в C# WPF MVVM

Событие в C# WPF MVVM

Есть 2 ViewModel`и AuthViewModel и LoginViewModelВ LoginView есть Frame который контент которого LoginControl а у него контекст AuthViewModel

146