Что более эффективно - буферы nodejs или типизированные массивы? Что я должен использовать для повышения производительности? Я думаю, что только те, кто знает интерьеры V8 и NodeJs, могут ответить на этот вопрос.
Буферы nodejs против типизированных массивов
Ответ 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).
В конце концов, вероятно, только хороший ориентир с тем, что вы хотите сделать, может пролить свет на это сомнение.