我需要快速地将数组的一部分复制到另一个数组中,替换它的旧值。
基准代码:http://codebase.es/test/copytest.htm
这是我的方法:
var i = 0x4000>>5; // loops count
var j = 0x4000; // write start index
var k = 0x8000; // read start index
while (i--) { // loop unrolling
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
//8
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
//16
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
//24
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
dst[j++]=src[k++]; dst[j++]=src[k++];
//32
} 这能做得更快吗?
发布于 2009-09-19 17:51:10
您可以继续展开循环,以获得更小的性能提升,但这似乎与您将要获得的速度一样快。正如Gumbo在评论中所指出的,尝试使用预增量而不是后置增量:
var i = 0x4000>>5 + 1; // loops count
var j = 0x4000 - 1; // write start index
var k = 0x8000 - 1; // read start index
while (--i) { // loop unrolling
dst[++j]=src[++k]; dst[++j]=src[++k];
dst[++j]=src[++k]; dst[++j]=src[++k];
dst[++j]=src[++k]; dst[++j]=src[++k];
dst[++j]=src[++k]; dst[++j]=src[++k];
//8
...发布于 2009-09-19 17:03:26
我不确定你的方法比这更快:
var i = 0x4000; // loops count
var j = 0x4000; // write start index
var k = 0x8000; // read start index
while (i--) { // loop unrolling
dst[j++]=src[k++];
}发布于 2009-09-19 17:06:48
我会考虑切片法:
var dst = src.slice(start,end)性能取决于javascript引擎的实现,但想必所有浏览器都已经在其平台上尽可能高效地实现了。
请参阅更多这里
https://stackoverflow.com/questions/1448943
复制相似问题