Эксклюзив: pragma 'vm:deeply-immutable' в Dart

Я — MADTeacher, автор книг по Dart/Flutter/ИИ в программировании и преподаватель. На канале разбираю свежие фичи языка и фреймворка, объясняю, как и когда их применять, и показываю всё на живых примерах кода. Меньше воды — больше практики: от конструкторов и метапрограммирования до производительности, интеропа и тестирования, а также поднимаю тему использования ИИ для разработки программных продуктов. Если хотите понимать Dart и Flutter в эпоху ИИ глубже — вы по адресу.

dartизолятыsendport

По умолчанию, виртуальная машина Dart выполняет неявное глубокое копирование передаваемых сообщений между изолятами одной группы. Этот процесс включает в себя сериализацию объектов в байты, их передачу и десериализацию на стороне принимающего изолята. Когда пересылаются сообщения небольшого объема это не критично, но вот при интенсивном обмене сообщениями или передаче сложных структур данных это может стать узким горлышком в производительности системы.

А что, если я скажу, что объекты между изолятами можно передавать через SendPort по ссылке, минуя стадию копирования? Да-да, ты не ослышался =)

Чтобы оптимизировать процесс передачи сообщений между изолятами одной группы, особенно, когда намечается их интенсивное перебрасывание из одного изолята в другой – используйте для этого классы данных (dataclass или DTO), аннотированные прагмой @pragma('vm:deeply-immutable')

@pragma('vm:deeply-immutable')
final class Dog {
  final String name;
  const Dog(this.name);
}

Для этого класс должен удовлетворять следующим условиям:

  1. 1️⃣ Все поля экземпляра класса должны быть final без всякого там модификатора late и должны иметь тип, который сам является глубоко неизменяемым (int, double, String, Null и т.д., нельзя использовать List, Map).
  2. 2️⃣ Класс должен быть объявлен как final или sealed для предотвращения создания несовместимых подклассов.
  3. 3️⃣ Все подклассы (в случае использования модификатора sealed) также должны быть глубоко неизменяемыми.
  4. 4️⃣ Суперкласс (за исключением Object) тоже должен быть глубоко неизменяемым.

Про это (и не только) можно почитать в моей книге "Dart Concurrency". Сегодня как раз закончил очередную главу "Изоляты и изоляционные группы" и перенес ее в курс на stepik - Основы разработки на Dart: магистр-джедай (в разработке)"

Фотоснимок страницы книги или документа с отрывком оглавления и текстом о Dart, виден фрагмент главы про изоляты и внутренние заметки автора.
Фрагмент страницы книги, связанный с главой «Изоляты и изоляционные группы».

Дискуссия

MADTeacher | Станислав Чернышев
JirafIvanich
>> без всяких там List, Map). То есть вот такой класс в диплю-иммутаблю завернуть не получится?
угу😭SendPort тоже не может быть типом поля такого класса =(
JirafIvanich
каеф. у меня в бэке это самый тяжелый процесс. сендпорт вроде можно передавать? или только через кодирование?
MADTeacher | Станислав Чернышев
JirafIvanich
каеф. у меня в бэке это самый тяжелый процесс. сендпорт вроде можно передавать? или только через кодирование?
Его можно пульнуть в обычном сообщении (которое скопируется) при инициализации соединения с изолятом, а класс с таким типом поля нельзя аннотировать этой прагмой
JirafIvanich
MADTeacher | Станислав Чернышев
Его можно пульнуть в обычном сообщении (которое скопируется) при инициализации соединения с изолятом, а класс с таким типом поля нельзя аннотировать этой прагмой
пусть пока так бегает, там железка в стойке стоит. хотел спросить про фризед, но они у меня в половине случаев с листом. тоже не вариант
Samir Akhmedov
Жесть, я у Gemini Deep Research запустил по аннотациям, он про это мне написал, и я даже не думал что этого нет нигде https://g.co/gemini/share/75da5d2a8726
Spetsialny
MADTeacher | Станислав Чернышев
угу😭SendPort тоже не может быть типом поля такого класса =(
А если тип поля будет UnmodifiableListView или UnmodifiableMapView?
Samir Akhmedov
Spetsialny
А если тип поля будет UnmodifiableListView или UnmodifiableMapView?
Эти 2 штуки - обертки над обычным списком, которые переопределяют большинство его методов на выброс ошибок. Но на low-level оно ничего не делает Могу ошибаться
MADTeacher | Станислав Чернышев
Spetsialny
А если тип поля будет UnmodifiableListView или UnmodifiableMapView?
Компилятор пропишет болты)
Присоединиться к обсуждению →

Читайте так же