如何从asm.js中的函数返回一个数字数组?

时间:2013-12-29 04:15:50

标签: javascript asm.js

我确信我最终可以解决这个问题,但文档有点冗长,我认为这应该是关于asm.js的常见问题。

这里是:

假设我有一个如下所示的函数:

function computeSquares() {
    var i, array = [];
    for(i = 0; i < 100; i++) {
        array.push(i * i);
    }
    return array;
}

上面的函数计算从0到99的整数的平方,并返回一个包含结果的数组。

我想在asm.js中编写一个这样的函数,它返回一个包含100个平方值的对象。如果我已阅读文档,我应该使用ArrayBuffer对象,但我对如何操作感到有点困惑。

请通过举例说明如何使用asm.js进行编码来说明我。

3 个答案:

答案 0 :(得分:0)

您只能从导出的函数返回双精度,有符号整数和空格。如果要返回一个数组,则必须将其写入堆中。

答案 1 :(得分:0)

模块看起来像这样:

function squaresModule(stdlib, foreign, heap) {
  "use asm";

  var imul = stdlib.Math.imul;
  var array = new stdlib.Uint32Array(heap);

  function compute( max ){
    max = max|0; //max is an integer
    var i = 0;

    for( i = 0;  (i|0) < (max|0);  i = (i+1)|0 ) {

      array[ i <<2>>2 ] = imul(i, i)|0;

    }

    return 0; //asm functions have to return a number
  }

  return {compute:compute};
}

然后使用execute并记录数组:

var array = Uint32Array( 100 );
var module = squareModule(
  {Math:Math,Uint32Array:Uint32Array}, {}, array.buffer
);
module.compute(100);
console.log(array);

答案 2 :(得分:0)

我不是返回一个数组,而是在asm.js中以方便的方式表示结果,然后在JS中用一个包装器函数提取它,重复调用asm.js代码来获取下一个值:

var result = [];
var i = 0;
while (true) {
    i = return_next_array_value_from_asmjs();
    if (i !== 0) {
        result.push(i);
    } else {
         break;
    }
}

缺点是您需要保留至少一个值作为停止标记。我没有测试过性能,因为我无法使用任何其他方法。