Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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
Actionscript 3 拼接速度是否比Shift+;流行音乐?为什么?_Actionscript 3 - Fatal编程技术网

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