По умолчанию, виртуальная машина Dart выполняет неявное глубокое копирование передаваемых сообщений между изолятами одной группы. Этот процесс включает в себя сериализацию объектов в байты, их передачу и десериализацию на стороне принимающего изолята. Когда пересылаются сообщения небольшого объема это не критично, но вот при интенсивном обмене сообщениями или передаче сложных структур данных это может стать узким горлышком в производительности системы.
А что, если я скажу, что объекты между изолятами можно передавать через SendPort по ссылке, минуя стадию копирования? Да-да, ты не ослышался =)
Чтобы оптимизировать процесс передачи сообщений между изолятами одной группы, особенно, когда намечается их интенсивное перебрасывание из одного изолята в другой – используйте для этого классы данных (dataclass или DTO), аннотированные прагмой @pragma('vm:deeply-immutable')
@pragma('vm:deeply-immutable')
final class Dog {
final String name;
const Dog(this.name);
}Для этого класс должен удовлетворять следующим условиям:
- 1️⃣ Все поля экземпляра класса должны быть final без всякого там модификатора late и должны иметь тип, который сам является глубоко неизменяемым (int, double, String, Null и т.д., нельзя использовать List, Map).
- 2️⃣ Класс должен быть объявлен как final или sealed для предотвращения создания несовместимых подклассов.
- 3️⃣ Все подклассы (в случае использования модификатора sealed) также должны быть глубоко неизменяемыми.
- 4️⃣ Суперкласс (за исключением Object) тоже должен быть глубоко неизменяемым.
Про это (и не только) можно почитать в моей книге "Dart Concurrency". Сегодня как раз закончил очередную главу "Изоляты и изоляционные группы" и перенес ее в курс на stepik - Основы разработки на Dart: магистр-джедай (в разработке)"



Дискуссия