Управление памятью в Nim
"Путь в ад вымощен благими намерениями."
Стратегии управления памятью в многопарадигменном подходе
Nim предлагает несколько различных стратегий управления памятью. Для выбора стратегии управления памятью используйте переключатель --mm:.
ARC/ORC
ORC — это стратегия управления памятью по умолчанию. Это режим управления памятью, основанный в основном на подсчёте ссылок. Циклы ссылок обрабатываются механизмом сбора циклов, основанным на «испытательном удалении». Поскольку алгоритмы, основанные на «прослеживании», не используются, поведение во время выполнения не зависит от размеров кучи и стека.
Операции подсчёта ссылок (= «операции RC») не используют атомарные инструкции и не должны — вместо этого целые подграфы перемещаются между потоками. Компилятор Nim также агрессивно оптимизирует операции RC и использует семантику перемещения.
Nim выполняет ряд оптимизаций для ARC/ORC; вы можете проверить, что он сделал с вашей критически важной для времени функцией, с помощью --expandArc:functionName. Аналогично, вы можете проверить весь модуль с помощью --expandArc:fileName.
--mm:arc использует тот же механизм, что и --mm:orc, но опускает коллектор циклов. И ARC, и ORC предлагают детерминированную производительность для систем с жёстким реальным временем, но ARC может быть проще для понимания для людей, приходящих из Ada/C++/C — грубо говоря, память для переменной освобождается, когда она выходит «из области видимости».
Мы обычно рекомендуем вам использовать аннотацию acyclic, чтобы оптимизировать накладные расходы коллектора циклов, но --mm:orc также генерирует больше машинного кода, чем --mm:arc, поэтому, если на целевой платформе важен размер кода, и вы знаете, что ваш код не генерирует циклы, вы можете использовать --mm:arc. Обратите внимание, что реализация асинхронного кода по умолчанию создает циклы и приводит к утечке памяти с помощью --mm:arc, другими словами, для async вам нужно использовать --mm:orc.
Другие режимы MM
refc инкрементальный, локальный для потока и не «останавливает мир».
--mm:refc--mm:markAndSweep--mm:boehm--mm:go--mm:none--mm:arc.Ниже приведён сравнительный анализ различных режимов управления памятью:
| Управление памятью | Куча | Циклы ссылок | Остановка мира | Атомарный | Совместимость с Valgrind | Переключатель командной строки |
|---|---|---|---|---|---|---|
| ORC | Общая | Коллектор циклов | Нет | Нет | Да | --mm:orc |
| ARC | Общая | Утечка | Нет | Нет | Да | --mm:arc |
| Атомарный ARC | Общая | Утечка | Нет | Да | Да | --mm:atomicArc |
| RefC | Локальная | Коллектор циклов | Нет | Нет | Нет | --mm:refc |
| Mark & Sweep | Локальная | Коллектор циклов | Нет | Нет | Нет | --mm:markAndSweep |
| Boehm | Общая | Коллектор циклов | Да | Нет | Нет | --mm:boehm |
| Go | Общая | Коллектор циклов | Да | Нет | Нет | --mm:go |
| None | Ручное | Ручное | Ручное | Ручное | Ручное | --mm:none |
Сборщик мусора JavaScript используется для целей компиляции JavaScript и NodeJS. Цель NimScript использует стратегию управления памятью, встроенную в компилятор Nim.
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/mm.html