2013-02-26 59 views
3

使用功能下,深入克隆树,为什么JSON比`in`和`map`克隆对象更快?

function clone_map(obj){ 
    return obj.map(function(val){ 
     return typeof(val) == "object" ? clone_map(val) : val; 
    }); 
}; 
function clone_forin(obj){ 
    var result = []; 
    for (var key in obj){ 
     var val = obj[key]; 
     result.push(typeof(val) == "object" ? clone_forin(val) : val); 
    }; 
    return result; 
}; 
function clone_json(obj){ 
    return JSON.parse(JSON.stringify(obj)); 
}; 

的JSON一个是最快的on my tests。为什么?还有更好的选择吗?

+0

因为数组很容易被序列化。在使用对象而不是数组时,'forin'解决方案更快:http://jsperf.com/treedeepclonejsonvsfunction/2 – Shmiddty 2013-02-26 21:56:48

+1

请注意,有人已在Safari上对其进行了测试,结果发现它不是*更快。实际上,JSON是最慢的(在Safari上)。所以它在Chrome上速度最快,在Safari上速度最慢。也许是其他浏览器的混合体。所以这里真的没有问题要回答。 – 2013-02-26 21:57:13

+0

@ T.J。 Crowder - 那就是我:)我认为使用的浏览器可能是一个因素。你在使用哪一个?在Safari中,'clone_map()'比其他的快得多。 – Stuart 2013-02-26 21:57:17

回答

4

从后续测试中可以看出,某些版本的Chrome浏览器的JSON选项更快,但Safari或Firefox浏览器的浏览器速度更快。您可能还会在其他浏览器中找到混合。

您的JavaScript克隆代码使用JavaScript。浏览器可以在高度优化的机器码中自由实现JSON.stringifyJSON.parse。 (如果需要,也可以将JavaScript编译为优化的机器代码。)因此,有时可能是,这是一个非常简单的数组,例如您测试的数组可能通过JSON更快,而不是更好。在一些引擎上。用一些样本数据集。而在其他引擎(或其他样本数据集)上,还有一个不同的结果。

同样值得注意的是,这种差异并不大,没有任何真实的世界意义。在Chrome 24中显示的测试中,JSON选项比其中最接近的竞争对手快25%左右。但是,每个单独的迭代都非常快,以至于它没有真正的差异。每秒392k运算/秒与521k运算/秒相比,仍然是运算速度/秒。 :-)