3

別の Float32Array の途中に Float32Array を挿入しようとしています。現在、新しい Float32Array を作成しており、3 つの for ループを使用して、この新しい Float32Array に要素を挿入しています (挿入前に 1 つ、新しい Float32Array を挿入するために 1 つ、挿入後に 1 つ)。

これには長い時間がかかります。Float32Array を別の配列に挿入するより速い方法はありますか? たとえば、に似た機能はありますか

// Suppose originalArray and insertedArray are 2 Float32Arrays of
// lengths 100000 and 5000 respectively, and I want to insert 
// insertedArray into originalArray at element 50000.

var combinedArray = new Float32Array(105000);
combinedArray.set(originalArray.subarray(0, 50000));
combinedArray.subarray(50000, 55000).set(insertedArray);
combinedArray.subarray(55000, 105000).set(originalArray.subarray(50000, 100000));

現在、上記のコードは機能しません。これは、メソッドが全体に関連するメソッドsubarrayで値を返さないためです。setFloat32Array

4

1 に答える 1

2

一連の命令だけでできることがあります。

var combinedArray = new Float32Array(105000);
combinedArray.set(originalArray);
[].splice.apply(combinedArray, [50000, 0].concat([].slice.call(insertedArray, 0)));

ただ、その性能についてはよくわかりません。combinedArray何らかの形で に変換されるのではないかと心配してArrayいるため、多くのメモリとおそらく CPU を占有します。すべきではありませんが、よくわかりません。

とにかく、setメソッドには2 番目のオプションの引数があります。つまり、新しい要素を設定する必要がある配列のオフセットです。したがって、最後の 2 行は次のようになります。

combinedArray.set(insertedArray, 50000);
combinedArray.set(originalArray.subarray(50000, 100000), 55000);

多分これはより効率的です。

編集:このテストによると、そうです。だから、あなたはあなたの方法を持っています。

于 2012-08-20T08:18:52.143 に答える