Actionscript 3 拼接速度是否比Shift+;流行音乐?为什么?
我从一些非特定来源听说,结合使用Actionscript 3 拼接速度是否比Shift+;流行音乐?为什么?,actionscript-3,Actionscript 3,我从一些非特定来源听说,结合使用shift()和pop()比使用splice()更快。我还没有运行基准测试,而且很可能会有一段时间不会运行,因为我不在城里,但这是真的吗?如果是,原因是什么?如果您不需要保留数组的顺序,那么使用。pop()比.splice()快得多 .splice()将删除给定索引处的元素。然后发生的情况是,在该元素之后,数组中的每个其他元素都需要将其在数组中的位置减少1。如果数组很大,并且删除元素的索引很小,那么这可能会很慢 使用.pop(),您可以完全删除重新索引所有内容的过
shift()
和pop()
比使用splice()
更快。我还没有运行基准测试,而且很可能会有一段时间不会运行,因为我不在城里,但这是真的吗?如果是,原因是什么?如果您不需要保留数组的顺序,那么使用。pop()
比.splice()
快得多
.splice()
将删除给定索引处的元素。然后发生的情况是,在该元素之后,数组中的每个其他元素都需要将其在数组中的位置减少1。如果数组很大,并且删除元素的索引很小,那么这可能会很慢
使用.pop()
,您可以完全删除重新索引所有内容的过程。您可以使用.pop()
从数组中删除最后一项,而不是删除给定索引中的元素。从这里开始,您只需将要删除的项目替换为使用.pop()
获得的项目。如前所述,这当然意味着不维护元素的顺序
代码示例:
.splice()
:
然后.pop()
:
这里我们有非常重要的实际性能测试:
var list:Array = [];
function fillList():void
{
for(var i = 0; i < 200000; i++) list.push(i);
}
function emptyViaSplice():void
{
fillList();
var t:Number = getTimer();
while(list.length > 0)
{
list.splice(0, 1);
}
trace("emptyViaSplice: " + (getTimer() - t));
}
function emptyViaPop():void
{
fillList();
var t:Number = getTimer();
while(list.length > 0)
{
if(list.length == 1) list.pop();
else
{
var l:* = list.pop();
list[0] = l;
}
}
trace("emptyViaPop: " + (getTimer() - t));
}
我尝试了另一个代码,结果如下所示:
var length = 200000;
function fillList() {
var list = [];
for(var i = 0; i < length; i++)
list.push(i);
return list;
}
function halfViaSplice() {
var list = fillList();
var startTime = new Date();
list.splice(length/2, length/2);
var endTime = new Date();
console.log("halfViaSplice: " + (endTime - startTime));
}
function halfViaPop() {
var list = fillList();
var startTime = new Date();
while(list.length > length/2) {
list.pop();
}
var endTime = new Date();
console.log("halfViaPop: " + (endTime - startTime));
}
halfViaSplice();
halfViaPop();
我同意Marty的回答,但是如果你从一个索引中删除所有最后的数据,而不是只删除一个洞的位置,我会建议使用splice而不是pop。经典算法有时更快。不更改阵列大小是实现快速性能的另一种方法。 在对performance.now()进行了几次测试之后,我发现在下面的例子中,这个经典算法比任何更改数组大小的方法都要快,而且与所有javascript代码一样,使用本地变量也会更快
var ArrayLength=Array.length;//总是喜欢最简单的参考资料。
对于(i=1;i
在同等条件下,上述代码的速度比
Array.shift();Array.push([[newdata1],[newdata2]]);
对于周期性变化的小数组(20到60个索引),您应该明确地考虑经典算法。
也许您可以建议它到+1来建议ActionScript基准向导:他的站点充满了伟大的技巧。var list:Array = [];
function fillList():void
{
for(var i = 0; i < 200000; i++) list.push(i);
}
function emptyViaSplice():void
{
fillList();
var t:Number = getTimer();
while(list.length > 0)
{
list.splice(0, 1);
}
trace("emptyViaSplice: " + (getTimer() - t));
}
function emptyViaPop():void
{
fillList();
var t:Number = getTimer();
while(list.length > 0)
{
if(list.length == 1) list.pop();
else
{
var l:* = list.pop();
list[0] = l;
}
}
trace("emptyViaPop: " + (getTimer() - t));
}
emptyViaSplice(); // 12153 ms
emptyViaPop(); // 37 ms
var length = 200000;
function fillList() {
var list = [];
for(var i = 0; i < length; i++)
list.push(i);
return list;
}
function halfViaSplice() {
var list = fillList();
var startTime = new Date();
list.splice(length/2, length/2);
var endTime = new Date();
console.log("halfViaSplice: " + (endTime - startTime));
}
function halfViaPop() {
var list = fillList();
var startTime = new Date();
while(list.length > length/2) {
list.pop();
}
var endTime = new Date();
console.log("halfViaPop: " + (endTime - startTime));
}
halfViaSplice();
halfViaPop();
halfViaSplice: 0
halfViaPop: 4