Использование smalloc в io.js

Первый выпуск для io.js вышел в этом месяце, я читал документы, когда нашел smalloc новый модуль, представленный в io.js.

До сегодняшнего дня я никогда не чувствовал необходимости делать это в JavaScript.

Мои вопросы:

  • Интересно, действительно ли существует потребность в необработанном распределении памяти в javscript с помощью smalloc?

  • Если это необходимо, то почему?

  • что будет использовать для использования smalloc?

  • и если нет, то почему члены io.js добавили этот модуль?

В нем также говорится

Возможно указать тип данных внешнего массива, который вы хотите. Все возможные варианты перечислены в smalloc.Types.

Пример использования:

var doubleArr = smalloc.alloc(3, smalloc.Types.Double);

и вот список поддерживаемых типов для размещения

smalloc.Types#

Int8
Uint8
Int16
Uint16
Int32
Uint32
Float
Double
Uint8Clamped
  1. Мы пытаемся сделать javascript строго типизированным языком?

Ответ 1

Прежде всего, буферы поддерживаются модулем smalloc, и этот модуль не был добавлен io.js devs, он был инициирован в ветке node 0.11, io.js только что импортирован. Распределение сырой памяти означает более низкий уровень манипуляции с памятью и, следовательно, более быстрые операции, более высокую производительность, что и означает node.js и io.js. Поэтому, если вам нужно реализовать что-то в бинарном мире, не ограничиваясь текущим Buffer API, вы должны использовать smalloc для создания собственных способов управления памятью. Как говорят документы:

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

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

Ответ 2

Спасибо @micnic за то, что ответили на вопрос хорошо. Я хотел бы предложить некоторую дополнительную информацию о том, почему я реализовал smalloc.

Не думайте, что исходные выделения памяти в JS - это нечто странное. Это тот же тип механизма, который используется Typed Arrays под капотом. Таким образом, где угодно вы можете использовать типизированный массив, вы также можете использовать smalloc. Преимущество smalloc заключается в том, что он ничего не определяет для вас. Предоставление максимальной гибкости вашего API. Это также безопасно, поскольку GC очистит ваши распределения, когда объект больше не используется.

Одно использование будет для математической библиотеки. Особенно, если вы пишете собственный модуль. Я лично использую его для сложных оптимизаций производительности распределения памяти на объекте, а затем обмена этой памятью между JS и С++, чтобы обеспечить совместное состояние между ними. Это самый быстрый способ сделать это и привел к некоторым впечатляющим оптимизациям в Node и io.js.

Помните, что вы можете выделить существующие объекты. В этом и заключается сила. Например:

function Alloc(n) {
  n >>>= 0;  // uint32 conversion
  this.length = n;
  smalloc.alloc(n, this);
}

var a = new Alloc(16);

Существует простая новая конструкция, которая просто выделяет массив данных Uint8 на экземпляр.

Я быстро повторю ответы на ваши вопросы:

  • Интересно, есть ли необходимость в распределении сырой памяти в javscript с помощью smalloc?

Да. Think Typed Arrays.

  1. Если это необходимо, то почему?

Отвечено выше. Кроме того, найдите все, что использует типизированные массивы.

  1. что будет использоваться для использования smalloc?

Отвечено выше. Кроме того, есть много других применений, которые разработчики находят для него.

  1. и если нет, то почему члены io.js добавили этот модуль?

Я написал это задолго до того, как io.js был вокруг.:)

  1. Мы пытаемся сделать javascript строго типизированным языком?

Абсолютно нет. Эти два варианта даже не связаны.

ОБНОВЛЕНИЕ: Из-за нарушения изменений, внесенных в V8 v4.4, smalloc отмечен как "устаревший", начиная с io.js v2.