io.js的第一个版本已于本月发布,当我在io.js中找到smalloc新模块时,我正在阅读文档。
到今天为止,我从来没有觉得需要在JavaScript中这样做。
我的问题是:
我想知道是否真的需要原始内存分配 使用
smalloc
的javscript?如果需要那么为什么?
使用
smalloc
的用例是什么?- 醇>
如果没有,那么为什么io.js成员会添加此模块?
它也说
可以指定您想要的外部数组数据的类型。 smalloc.Types
中列出了所有可能的选项。
使用示例:
var doubleArr = smalloc.alloc(3, smalloc.Types.Double);
以下是分配支持的类型列表
smalloc.Types#
Int8
Uint8
Int16
Uint16
Int32
Uint32
Float
Double
Uint8Clamped
- 我们是否尝试将javascript设为strongly typed language?
醇>
答案 0 :(得分:8)
首先,缓冲区由smalloc模块支持,io.js
开发人员未添加此模块,它是在node 0.11
分支中启动的,io.js
刚刚导入它。原始内存分配意味着较低级别的内存操作,因此 - 更快的操作,更好的性能,这是node.js
和io.js
的目标。因此,如果您需要在二进制世界中实现某些内容而不限于当前的Buffer API,则应使用smalloc创建自己的方法来操作内存。正如文档所说:
这可以用来创建自己的类似Buffer的类。没有设置其他属性,因此用户需要跟踪其他必要信息(例如分配的长度)。
此外,这不是尝试使javascript成为强类型语言,这只是内存操作,不能以其他方式完成,以确保更高的性能。
答案 1 :(得分: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);
有一个简单的新构造,只是在实例上分配一个Uint8
外部数据。
我会很快重申你的问题的答案:
是。想想Typed Arrays。
上面回答。此外,搜索使用Typed Arrays的任何内容。
上面回答。此外,开发人员还有许多其他用途。
我在io.js出现之前写的很久了。 :)
绝对没有。这两者甚至都不相关。
更新:由于V8 v4.4中发生了重大更改,{i}已从io.js v2开始标记为“已弃用”。