Javascript数组,排序和分支前缀

Geu*_*uis 8 javascript arrays

编辑 花了几个小时来完成这个并使用@pst之后,事实证明这个问题完全不同了.

在代码中,您可以看到我使用了"+ new Date()"的时间戳快捷方式.这将返回时间戳,标准"new Date().getTime()"也是如此.

但是,+ new Date()在与数学运算(+, - ,/)一起使用时执行得非常非常糟糕.虽然'start'变量的typeof()表示'number',但是有些东西会让它变得很慢.使用标准getTime()方法时,在进行时序减法时不会有性能损失.

看一下详细解决这个问题的jsperf,http: //jsperf.com/new-date-timing .

关于@pst的非常详细的答案以及我为复制链接问题所做的努力,使用他的答案作为该问题的规范答案.

我将更改此问题的标题以准确反映@ pst的答案和我的原始意图,但会保留原始标题和问题以供将来参考.

新问题

javascript数组是否对随机排序和未排序数据的数组使用分支预测?

请参阅下面的@ pst答案.

原标题和问题如下

标题:数组迭代在同一数据上占用2倍的时间

我之前看过这个问题,为什么处理排序数组比未排序数组更快?,并想尝试在JavaScript中设置相同的测试.

这让我意想不到.在以下小提琴中链接的测试中,简单地使用相同的代码迭代相同的随机生成的数值数组会导致响应时间大不相同.

我在Chrome,Safari,Firefox和node.js中对此进行了测试.

在Chrome&node中,第一次迭代比第二次迭代更快.在Safari和Firefox中,第一次迭代比第二次迭代.

这是小提琴,http://jsfiddle.net/9QbWB/6/

在链接的小提琴中,我禁用了排序(认为最初是问题,但事实并非如此).对数据进行排序使循环更长.

我已经彻底完成了代码,以确保我删除了任何可能影响结果的内容.我觉得这是一群特别的科学家宣布FTL中微子,我在实验中找不到问题,数据是出乎意料的.

在下面包含的代码中,初始setTimeout,jQuery DOM可视化等一些内容用于在jsfiddle.net中直观地显示数据.核心功能是相同的.

    //javascript test of https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array

setTimeout(function(){

    var unsorted_list = $('#unsorted'),
        sorted_list = $('#sorted');


    var length = 32768,
        data = [];

    for(var i=0; i<length; i++){
        data[i] = Math.floor( Math.random()*256); 
    }


    var test = function(){
        var sum = 0,
            start = +new Date();

        for(var i=0; i<1000; i++){
            for(var c=0; c<length; c++){
                if( data[c] >= 128 ){
                    //sum += data[c];
                }
            }
        }

        return +new Date() - start;
    }


    //Unsorted
    var results = 0;
    for( var i=0; i<10; i++){
        var x = test();
        console.log(x);
        unsorted_list.append('<div>'+x+'</div>');
        results += x;
    }
    unsorted_list.append('<div>Final:'+(results/10)+'</div>');
    console.log( 'Unsorted: ', results/10 );


    //Sort array
    //data.sort();

    //Sorted
    var results = 0;
    for( var i=0; i<10; i++){
        var x = test();
        console.log(x);
        sorted_list.append('<div>'+x+'</div>');

        results += x;
    }
    sorted_list.append('<div>Final:'+(results/10)+'</div>');
    console.log( 'Sorted: ', results/10 );

},5000);
Run Code Online (Sandbox Code Playgroud)

小智 4

(显然这个答案错过了这个问题 - 由于相关原因留在这里。)


这是我的jsperf 案例 - http://jsperf.com/sorted-loop/2 - 也许更多的浏览器会揭示足够的东西。我还包含了一个仅使用按位运算的测试用例,如从链接的帖子中获取的(并且我尚未验证 JS 中的有效性)。

结论:性能似乎与分支预测有关。

  1. “+bitwise”测试对对在所有主要浏览器运行中的速度相同(对于同一浏览器)。(Chrome 在按位运算方面仅比 FF 快,而 FF 仅比 IE 快;请参阅其他 SO 帖子。)

  2. 使用条件的“+cond”测试对受到很大影响,排序后的数据受到高度青睐。如果分支预测是一个因素,这就是预期的结果。