Каковы максимальные ограничения памяти в WebAssembly? - PullRequest
0 голосов
/ 01 мая 2019

Когда я объявляю секцию памяти в WebAssembly, я должен установить начальный размер и установить необязательный максимальный размер.

Есть ли у вас какие-либо преимущества, если я установлю максимум на то же значение, что и начальное значение? Каковы значения этого значения для среды выполнения WebAssembly?

Справочная информация: я пишу Java для компилятора WebAssembly и хочу использовать функцию GC для своих данных. Мне не нужно наращивать память. Я бы использовал его только для постоянных значений.

1 Ответ

2 голосов
/ 01 мая 2019

Выделение большой памяти (особенно в гигабайтах) может привести к сбою. Не удалось выделить начальную память: фатальная ошибка, в то время как увеличение памяти позже не удалось. Поэтому рекомендуется начать с меньшего и безопасного начального размера.

Сообщества WebAssembly уже предоставляют довольно хорошую документацию:

Я обобщу информацию о том, как работает память WebAssembly.

Почему нам нужен дополнительный максимальный размер

Базовая память WebAssembly является JS ArrayBuffer объектом. ArrayBuffer не является динамическим массивом, то есть его нельзя изменить. Однако Wasm Memory - это специальный ArrayBuffer, размер которого можно изменить с помощью вызова Memory.grow () , что соответствует инструкции grow_memory в Wasm. Тем не менее, реализация изменения размера ArrayBuffer стоит дорого - это то же самое, что и realloc(), который выделяет новый буфер с новым размером, а затем освобождает старый буфер. Вы можете избежать накладных расходов на перераспределение буфера, выделяя большую начальную память, но это вызывает другую проблему, которая может привести к сбою операции и невозможности сделать это, так как движку Wasm не удалось загрузить двоичный файл Wasm.

Опциональный максимальный размер решает эти проблемы. Когда максимальный размер определен, память Wasm пытается предварительно выделить максимальный размер буфера. Предварительно выделив буфер, вы можете изменить его размер позже без дорогостоящей операции realloc(). Это нормально, даже если операция предварительного выделения завершилась неудачно - вы можете попробовать reallocte позже, когда вам нужно.

Сценарии изменения размера памяти WebAssembly

  • grow_memory без установки максимального размера: движок Wasm пытается перераспределить весь буфер, что очень дорого и увеличивает вероятность сбоя.
  • Выделение большой начальной памяти: может произойти сбой, и его сбой является фатальной ошибкой.
  • grow_memory с максимальным размером: движок будет использовать предварительно выделенный буфер мгновенно. Даже если он не вырос, это не фатальная ошибка.
  • Установка начального размера == максимальный размер: Ни от одного из них вы не выиграете. Может возникнуть фатальная ошибка, и вы не сможете изменить ее размер позже.
...