← Назад к вопросам
Почему LINQ не является оптимизированным?
2.2 Middle🔥 151 комментариев
#C# и ООП#Оптимизация
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Почему LINQ не является оптимизированным в Unity
Это критичный вопрос для game development. За 10+ лет я видел проекты, которые замедлялись из-за неправильного использования LINQ в горячем коде.
Основные проблемы LINQ
Аллокация памяти и GC давление — главная проблема:
- Каждый вызов LINQ создаёт временные enumerators
- Where().Select().ToList() аллоцирует промежуточные коллекции
- В Update(), вызываемом 60+ раз в секунду, это критично
var result = enemies.Where(e => e.IsAlive).ToList();
// Аллоцирует новый список каждый раз!
Deferred Execution — непредсказуемое выполнение:
var query = enemies.Where(e => e.IsAlive); // Не выполнилось!
foreach (var e in query) e.Die(); // Выполняется здесь
Скрытые операции в горячем коде:
var closest = enemies.OrderBy(e => Vector3.Distance(e.Pos, player.Pos)).First();
// Сортирует ВСЕ врагов вместо поиска минимума!
Когда LINQ приемлем
- Инициализация — при загрузке уровня, один раз
- Редкие операции — раз в несколько секунд
- Не в Update/LateUpdate — критичные методы
Альтернативы
Простые циклы — базовый for/foreach, нулевые аллокации
Кэширование результатов — вычислить один раз, переиспользовать
Native Collections — Unity Collections, совместимо с Burst
DOTS подход — Data-Oriented Tech Stack для масштабирования
Best Practice
Профилируй код (Unity Profiler), измеряй память и fps. Используй LINQ только когда performance не критичен. В Update loop — только простые циклы без аллокаций.