在io.js中使用smalloc

Nae*_*ikh 6 javascript buffer node.js io.js

io.js的第一个版本已于本月发布,当我发现smalloc在io.js中引入了一个新模块时,我正在阅读文档.

直到今天,我从未觉得需要在JavaScript中这样做.

我的问题是:

  1. 我想知道在javscript中是否真的需要使用原始内存分配smalloc

  2. 如果它需要那么为什么?

  3. 使用的用例是smalloc什么?

  4. 如果没有那么为什么io.js会员添加这个模块?

它还说

可能是指定您想要的外部数组数据的类型.所有可能的选项都列在smalloc.Types.

用法示例:

var doubleArr = smalloc.alloc(3, smalloc.Types.Double);
Run Code Online (Sandbox Code Playgroud)

这是分配支持的类型列表

smalloc.Types#

Int8
Uint8
Int16
Uint16
Int32
Uint32
Float
Double
Uint8Clamped
Run Code Online (Sandbox Code Playgroud)
  1. 我们是否尝试将javascript设为强类型语言

mic*_*nic 8

首先,缓冲区由smalloc模块支持,并且io.jsdevs 不添加此模块,它是在node 0.11分支中启动的,io.js只是导入它.原始内存分配意味着存储器操作,因此较低水平-提高作业速度,更好的性能,这是什么目的都node.jsio.js.因此,如果您需要在二进制世界中实现某些内容而不限于当前的Buffer API,则应使用smalloc创建自己的方法来操作内存.正如文档所说:

这可以用来创建自己的类似Buffer的类.没有设置其他属性,因此用户需要跟踪其他必要信息(例如分配的长度).

此外,这不是尝试使javascript成为强类型语言,这只是内存操作,它不能以其他方式完成,以确保更高的性能.


Tre*_*ris 7

感谢@micnic好好回答这个问题.我想提供一些关于我为什么实施smalloc的补充信息.

不要以为JS中的原始内存分配是一些奇怪的新事物.它与引擎盖下的Typed Arrays使用的机制类型相同.因此,在任何可以使用Typed Array的地方,您也可以使用smalloc.smalloc的优点是它没有为您定义任何东西.允许API的最大灵活性.它也是安全的,因为GC将在不再使用对象时清理您的分配.

一种用法是数学库.特别是如果编写本机模块.我个人将它用于在对象上分配内存然后在JS和C++之间共享该内存以在两者之间实现共享状态的棘手性能优化.到目前为止,它是最快的方式,并且在Node和io.js中带来了一些令人印象深刻的优化.

请记住,您可以分配到现有对象.权力在哪里.例如:

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

var a = new Alloc(16);
Run Code Online (Sandbox Code Playgroud)

有一个简单的新构造,只是Uint8在实例上分配一个外部数据.

我会很快重申你的问题的答案:

  1. 我想知道是否真的需要使用smalloc在javscript中进行原始内存分配?

是.想想Typed Arrays.

  1. 如果它需要那么为什么?

以上回答.此外,搜索使用Typed Arrays的任何内容.

  1. 使用smalloc的用例是什么?

以上回答.此外,开发人员还有许多其他用途.

  1. 如果没有那么为什么io.js会员添加这个模块?

我在io.js出现之前写的很久了.:)

  1. 我们是否尝试将javascript设为强类型语言?

绝对没有.这两者甚至都不相关.

更新:由于V8 smallocv4.4中的更改中断,因此已在io.js v2中标记为"已弃用".