Подтвердить что ты не робот

Буферы nodejs против типизированных массивов

Что более эффективно - буферы nodejs или типизированные массивы? Что я должен использовать для повышения производительности? Я думаю, что только те, кто знает интерьеры V8 и NodeJs, могут ответить на этот вопрос.

4b9b3361

Ответ 1

A Node.js buffer должен быть более эффективным, чем типизированный массив. Причина заключается только в том, что при создании нового буфера Node.js его не нужно инициализировать для всех 0. В то время как спецификация HTML5 утверждает, что инициализация типизированных массивов должна иметь свои значения, равные 0. Выделение памяти, а затем установка всей памяти на 0 занимает больше времени.

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

Хорошая дискуссия здесь: https://github.com/joyent/node/issues/4884

Ответ 2

Есть несколько вещей, которые, я думаю, стоит упомянуть:

  • Buffer экземпляры Uint8Array, но есть тонкие несовместимости с спецификацией TypedArray в ECMAScript 2015. Например, в то время как ArrayBuffer#slice() создает копию среза, реализация Buffer#slice() создает представление поверх существующего Буфера без копирования, делая Buffer#slice() гораздо более эффективным.
  • При использовании Buffer.allocUnsafe() и Buffer.allocUnsafeSlow() память не обнуляется (как уже указывали многие). Поэтому убедитесь, что вы полностью перезаписали выделенную память, или вы можете пропустить старые данные, когда считывается память буфера.
  • TypedArrays не читаются сразу, для этого вам понадобится DataView. Это означает, что вам, возможно, потребуется переписать код, если вы должны вернуться к Buffer. Шаблон адаптера может помочь здесь.
  • Вы можете использовать для в Buffer. Вы не можете на TypedArrays. Также у вас не будет классических entries(), values(), keys() и length.
  • Buffer не поддерживается в интерфейсе, а TypedArray вполне может быть. Поэтому, если ваш код делится между интерфейсом или бэкэнд, вы можете подумать о том, чтобы придерживаться одного.

Дополнительная информация в документах здесь.

Ответ 3

Это сложно, но я думаю, что это будет зависеть от того, что вы планируете делать с ними и с какими объемами данных вы планируете работать?

типизированные массивы нуждаются в буферах node, но их легче играть, и вы можете преодолеть ограничение 1 ГБ (kMaxLength = 0x3fffffff).

Если вы делаете обычные вещи, такие как итерации, настройки, получение, нарезка и т.д.... тогда типизированные массивы должны быть лучшими для производительности, а не для памяти (особенно если вы имеете дело с типами float и 64bits).

В конце концов, вероятно, только хороший ориентир с тем, что вы хотите сделать, может пролить свет на это сомнение.