使用lodash.clonedeep

时间:2017-12-13 12:30:05

标签: javascript google-chrome internet-explorer knockout.js lodash

我需要一些关于我当前问题的想法......

我目前正在改进一个大型软件的一个小但常见的部分。这意味着如果不创建极端的测试开销甚至影响功能,我可能无法替换功能。

我正在尝试克隆一个数据结构,除了普通数据之外还包含大量的淘汰观察数据。这样做我发现Chrome和IE之间存在严重的性能差异。 有可能存在循环引用,也有可能,淘汰观察者不知何故不喜欢被克隆。或者也许是互联网 Explorer达到了某种可以扩展的数据大小限制。无论原因是什么,Chrome都会做得更好。

由于以下原因,问题愈演愈烈:

我需要数万个“美化JSON”(!!)行的巨大数据结构来模拟 现实生活并创造这个大问题。这个数据量可能不会减少到可调试的范围,因为数据越小,时间越少 寻找差异,最后消失。发布数据结构对我来说也是不可能的,因为我无法匿名生成这么多数据。有了这个 数据大小在调试时不可能发现数据问题。

我不认为谷歌比微软优越,所以我希望这个问题与数据有关,或者能够被某些浏览器设置消除。 总的来说,在互联网上我可以读到,lodash.clonedeep()会很慢或者Internet Explorer会很慢。如果是这样,这可能不是我的问题。在我看来,这并没有解释Chrome和Internet Explorer的巨大差异。 这样的答案对我来说太简单了,我需要一些改进,因为我们的大多数客户都使用Internet Explorer,这是不可能改变的。

我确实在Chrome和Internet Explorer中运行了以下行。

console.time('jquery.extend()');
dataCopy = $.extend(true, {}, viewModel.api.getData());
console.timeEnd('jquery.extend()');
console.time('lodash.clonedeep()');
dataCopy = _.cloneDeep(viewModel.api.getData());
console.timeEnd('lodash.clonedeep()');
console.time('JSON.parse(JSON.stringify())');
dataCopy = JSON.parse(JSON.stringify(viewModel.api.getData()));
console.timeEnd('JSON.parse(JSON.stringify())');

输出如下

Chrome Version 62.0.3202.94:
jquery.extend(): 1159.470947265625ms
lodash.clonedeep(): 2783.241943359375ms
JSON.parse(JSON.stringify()): 1139.403076171875ms

Internet Explorer Version 11.0.9600.18837:
jquery.extend(): 10.802,27ms
lodash.clonedeep(): 28.302,65ms
JSON.parse(JSON.stringify()): 10.479,681ms

有没有人知道

  • 为什么存在这种巨大的差异?
  • 在这种情况下将IE(几乎)加速到Chrome的速度的方法是什么?
  • 暗示要看什么? /找出问题所在?
  • 找出lodash.clonedeep()中包含如此巨大数据的方法? (比断点更有效率。)
  • 可以从任何可以提供帮助的地方调试输出消息吗?
  • 在IE上对lodash.clonedeep()的淘汰观察者有一个已知的影响吗?
  • 淘汰观察者是否不喜欢被克隆?
  • 循环结构是否是克隆的问题? (如果是这样,为什么Chrome更快?)

我正在寻找解决方案以及最佳实践。

感谢大家!

0 个答案:

没有答案
相关问题