如何将TypedArray复制到另一个TypedArray?

Bre*_*ill 9 javascript performance typedarray

C#具有高性能阵列复印功能来复制阵列到位:

Array.Copy(source, destination, length)
Run Code Online (Sandbox Code Playgroud)

它比手动操作更快,即:

for (var i = 0; i < length; i++)
    destination[i] = source[i];
Run Code Online (Sandbox Code Playgroud)

我在寻找一个相当于高性能复制功能来复制阵列到位在Javascript中,用于Int32Array和Float32Array能及时发现没有这样的功能:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

最接近的是"copyWithin",它只在数组内部进行复制.

是否有一个内置的高性能拷贝功能TypedArrays 到位

B计划,是否有内置的高性能克隆功能?(编辑:看起来像slice()就是答案)

aps*_*ers 16

您正在寻找.set哪个允许您使用输入数组(或TypedArray)设置数组的值,可选择从目标数组上的某个偏移量开始:

destination.set(source);
destination.set(source, offset);
Run Code Online (Sandbox Code Playgroud)

或者,设置有限数量的输入数组:

destination.set(source.slice(limit), offset);
Run Code Online (Sandbox Code Playgroud)

如果你想要创建一个新的TypedArray,你可以简单地使用.slice:

source.slice();
Run Code Online (Sandbox Code Playgroud)

  • BTW如果您正在寻找效率,可以使用`source.subarray(limit)`而不是`slice`,这样只创建一个新视图并使用相同的底层数据存储(不需要中间数据复制). (7认同)
  • 确实不幸的是,`TypesArray.set()` 不接受可选的第三个参数来限制要复制的条目数量。因此,目前使用“source.subarray(limit)”创建中间视图似乎是可行的方法。 (3认同)

cui*_*ing 6

克隆到现有的类型化数组:

destination.set(source);
destination.set(source, offset);
Run Code Online (Sandbox Code Playgroud)

克隆到一个新的 typedarray 示例:(这是最快的!)

var source = new Uint8Array([1,2,3]);
var cloned = new Uint8Array(source);
Run Code Online (Sandbox Code Playgroud)


Vin*_*y M 5

您可以使用slice(0);.

var clone = myArray.slice(0);
Run Code Online (Sandbox Code Playgroud)

您可以将其设为本机方法:

Array.prototype.clone = function() {
    return this.slice(0);
};
Run Code Online (Sandbox Code Playgroud)

与循环相比的性能链接

  • 请不要扩展本机数组。它比仅仅做`.slice(0)`要慢得多。 (3认同)
  • [`slice`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) 是要走的路。如果这还不够高性能,那么downvoter 应该downvote JavaScript,而不是messenger。 (2认同)
  • 你不需要`0`。查看副本:http://stackoverflow.com/q/7486085/215552 (2认同)
  • @MikeMcCaughan,实际上 0 运行得更快,这是一个性能问题。 (2认同)