Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将TypedArray复制到另一个TypedArray?_Javascript_Performance_Typedarray - Fatal编程技术网

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

Javascript 如何将TypedArray复制到另一个TypedArray?,javascript,performance,typedarray,Javascript,Performance,Typedarray,C#具有高性能阵列复制功能,可将阵列复制到位: 它比手动操作快,即: for (var i = 0; i < length; i++) destination[i] = source[i]; for(变量i=0;i

C#具有高性能阵列复制功能,可将阵列复制到位:

它比手动操作快,即:

for (var i = 0; i < length; i++)
    destination[i] = source[i];
for(变量i=0;i
对于Javascript中的Int32Array和Float32Array,我正在寻找一个等效的高性能复制函数来就地复制数组,但找不到这样的函数:

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

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


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

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

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

Array.prototype.clone = function() {
    return this.slice(0);
};
性能与您正在寻找的循环比较,循环允许您使用输入数组(或TypedArray)设置数组的值,可以选择从目标数组的某个偏移开始:

destination.set(source);
destination.set(source, offset);
或者,要设置有限数量的输入数组:

destination.set(source.slice(limit), offset);
如果您想创建一个新类型Darray,只需使用
.slice

source.slice();

克隆到现有类型Darray:

destination.set(source);
destination.set(source, offset);
克隆到新类型Darray示例:(最快!)


你可以使用Array.join()@Array.join(),
Array.join
?这甚至不返回数组。可能是@MikeMcCaughan的重复。我不同意这个问题是重复的。这个问题首先问的是如何将值复制到现有数组中,而这个问题问的是如何创建新数组。(这个问题允许创建一个新数组只是作为最后的手段。)在这种情况下,答案似乎是
.set
;在这种情况下,答案是
.slice
。尽管如此,我认为另一个问题是一个有用的指标。我们能得到一个样本数据集来比较性能测试中的答案吗?这是一条路要走。如果这还不够高,那么downvoter应该对JavaScript而不是messenger进行downvote。您不需要
0
。请参阅副本:@MikeMcCaughan,实际上0运行得更快,这是一个性能问题。谢谢,事实上,出于充分的理由,我倾向于“就地”复制到现有阵列中,以最大限度地减少内存波动,并且必须更新引用。因此,slice()是不可取的。性能链接似乎适用于JS数组,而不是TypedArrays。请不要扩展本机数组。这比只做
.slice(0)
要慢得多。顺便说一句,如果你想提高效率,你可以使用
source.subray(limit)
而不是
slice
,这样只会创建一个新的视图,并使用相同的底层数据存储(不需要中间数据副本)。不幸的是
TypesArray.set()
不接受第三个可选参数来限制要复制的条目数。因此,目前使用
source.subarray(limit)
创建一个中间视图似乎是可行的方法。
source.slice();
destination.set(source);
destination.set(source, offset);
var source = new Uint8Array([1,2,3]);
var cloned = new Uint8Array(source);