2016-04-25 44 views
2
function reverseArray(array) { 
    var output = []; 
    for (var i = array.length - 1; i >= 0; i--) 
    output.push(array[i]); 
    return output; 
} 

function reverseArrayInPlace(array) { 
    for (var i = 0; i < Math.floor(array.length/2); i++) { 
    var old = array[i]; 
    array[i] = array[array.length - 1 - i]; 
    array[array.length - 1 - i] = old; 
    } 
    return array; 
} 

我试过performance.now()上的Chrome浏览器,但每次都得到不同的结果。另外,performance.now()是检查代码性能的好方法吗?以下功能的性能更好?

+2

看起来像[jsperf]工作(http://jsperf.com) – Pointy

+1

@Pointy jsperf不可用。 –

+0

噢,这将是一个很大的问题,我想:) – Pointy

回答

3

你的第二个功能更快。

想想循环多少次需要“循环” - 第二功能,您减少了一半的循环,所以应该有更好的表现。在第一个函数中,您可以一直循环访问数组。

我们在这里谈的是时间复杂度,其中有对SO一些伟大的答案,这其中尤其是:How to find time complexity of an algorithm

+0

你可以请回答为什么performance.now()给同一台机器上的不同输出相同的浏览器? –

+0

有什么区别?你应该使用jsperf ...当其备份当然 – JordanHendrix

+0

0.1250毫秒的第一个功能,0.2950毫秒的第二个功能。另一个结果:第一个功能为0.1850毫秒,第二个功能为0.1200毫秒。 –

0

在你aplying所谓循环展开的第二功能。是一种提高性能的已知方法(在循环过程中,当循环完成一次迭代时,加载到分段管道中的指令将不再流动,从而不得不再次加载它们)。

然而,这并不总是正确的(看到这个帖子Is GCC loop unrolling flag really effective?

你能做的最好的是基准它自己。

+0

你可以请回答为什么performance.now()给不同的输出在同一台机器相同的浏览器? –

+0

@kamalkokne谷歌浏览器内置了性能测量工具。我建议使用那个来代替https://developer.chrome.com/devtools/docs/cpu-profiling – Nadir