我确信我最终可以解决这个问题,但文档有点冗长,我认为这应该是关于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进行编码来说明我。
答案 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;
}
}
缺点是您需要保留至少一个值作为停止标记。我没有测试过性能,因为我无法使用任何其他方法。