在io.js中使用smalloc

时间:2015-01-21 11:38:23

标签: javascript node.js buffer io.js

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

到今天为止,我从来没有觉得需要在JavaScript中这样做。

我的问题是:

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

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

  4.   
  5. 使用smalloc的用例是什么?

  6.   
  7. 如果没有,那么为什么io.js成员会添加此模块?

  8.   

它也说

可以指定您想要的外部数组数据的类型。 smalloc.Types中列出了所有可能的选项。

使用示例:

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

以下是分配支持的类型列表

smalloc.Types#

Int8
Uint8
Int16
Uint16
Int32
Uint32
Float
Double
Uint8Clamped
  
      
  1. 我们是否尝试将javascript设为strongly typed language
  2.   

2 个答案:

答案 0 :(得分:8)

首先,缓冲区由smalloc模块支持,io.js开发人员未添加此模块,它是在node 0.11分支中启动的,io.js刚刚导入它。原始内存分配意味着较低级别的内存操作,因此 - 更快的操作,更好的性能,这是node.jsio.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外部数据。

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

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

    1. 如果需要那么为什么?
    2. 上面回答。此外,搜索使用Typed Arrays的任何内容。

      1. 使用smalloc的用例是什么?
      2. 上面回答。此外,开发人员还有许多其他用途。

        1. 如果没有,那么为什么io.js成员添加了这个模块?
        2. 我在io.js出现之前写的很久了。 :)

          1. 我们是否尝试将javascript设为强类型语言?
          2. 绝对没有。这两者甚至都不相关。

            更新:由于V8 v4.4中发生了重大更改,{i}已从io.js v2开始标记为“已弃用”。