【问题标题】:How to copy TypedArray into another TypedArray?如何将 TypedArray 复制到另一个 TypedArray 中?
【发布时间】:2016-06-04 11:06:46
【问题描述】:

C#有一个高性能的数组复制功能就地复制数组

Array.Copy(source, destination, length)

这比手动操作要快,即:

for (var i = 0; i < length; i++)
    destination[i] = source[i];

我正在寻找一个等效的高性能复制函数来复制数组就地,用于 Javascript 中的 Int32Array 和 Float32Array,但找不到这样的函数:

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

最接近的是“copyWithin”,它只在数组内部进行复制。

TypedArrays 是否有内置的高性能复制功能就地

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

【问题讨论】:

  • 你可以使用 Array.join()
  • @علاء الدين, Array.join?甚至不返回一个数组。
  • @MikeMcCaughan 我不同意这个问题是重复的。这个问题首先询问如何将值复制到现有数组,而该问题询问如何创建新数组。 (这个问题允许创建一个新数组只是作为最后的手段。)在这种情况下,答案似乎是.set;在这种情况下,答案是.slice。不过,我认为其他问题是一个有用的指针。
  • 我们能否获得一个样本数据集来比较性能测试中的答案?

标签: javascript performance typedarray


【解决方案1】:

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

destination.set(source);
destination.set(source, offset);

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

destination.set(source.slice(limit), offset);

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

source.slice();

【讨论】:

  • 顺便说一句,如果您正在寻找效率,您可以使用source.subarray(limit) 而不是slice,因此只创建一个新视图并使用相同的底层数据存储(不需要中间数据复制)。
  • 很遗憾TypesArray.set() 不接受可选的第三个参数来限制要复制的条目数。所以目前使用source.subarray(limit) 创建一个中间视图似乎是要走的路。
【解决方案2】:

您可以使用slice(0); 克隆数组。

var clone = myArray.slice(0);

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

Array.prototype.clone = function() {
    return this.slice(0);
};

性能link 与循环比较

【讨论】:

  • slice 是要走的路。如果这还不够高性能,那么反对者应该反对 JavaScript,而不是信使。
  • 你不需要0。查看副本:stackoverflow.com/q/7486085/215552
  • @MikeMcCaughan,实际上 0 跑得更快,这是一个性能问题。
  • 谢谢,实际上,出于充分的理由,我更喜欢“就地”复制到现有数组中,以最大程度地减少内存波动并不得不更新引用。因此 slice() 是不可取的。性能链接似乎适用于 JS 数组,而不是 TypedArrays。
  • 请不要扩展原生数组。它比只做.slice(0) 慢得多。
【解决方案3】:

克隆到现有的类型数组:

destination.set(source);
destination.set(source, offset);

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

var source = new Uint8Array([1,2,3]);
var cloned = new Uint8Array(source);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 2011-11-20
    • 2014-09-11
    • 2017-07-15
    • 2016-10-04
    • 2016-01-24
    • 2012-07-28
    • 2018-12-21
    相关资源
    最近更新 更多