← Назад к вопросам

Почему 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 — только простые циклы без аллокаций.

Почему LINQ не является оптимизированным? | PrepBro