【问题标题】:Function slows down after upgrading npm packages升级 npm 包后功能变慢
【发布时间】:2019-12-17 23:36:08
【问题描述】:

我已经将一个使用 vue/vuex/vuetify 的应用程序升级到了最新的 npm 包(实际上是从 Vuetify 1.5 到 2.0,而对于其他包来说只是次要版本),虽然它可以工作,但 vuex 商店中的一个功能使用reduce() 似乎已经从 500ms 减慢到了将近 10s。

时间来自 Chrome DevTools -> 性能

我已将 reduce() 替换为 forEach() 循环,这样可以像以前一样加快它的速度。但是,我似乎无法找出为什么它首先变慢了?我怀疑编译过程发生了某种变化?

vuex存储慢码(升级后才可以):

 var x = items.reduce((acc, item) => { 
    return {[item.id]: item, ...acc}
 });

两种情况下的快速代码:

 items.forEach(el => {
     x[el.id] = el;
 });

【问题讨论】:

  • 你在使用 Babel 吗?如果有,之前是哪个版本,现在是哪个版本?

标签: javascript vue.js vuex vuetify.js


【解决方案1】:

.reduce() 代码在每次迭代时都会创建一个新对象,并从之前的累加器对象中复制所有属性。如果有很多很多项,那就是大量的工作;这就是你所说的 O(n2) 算法。

可以向现有对象添加新属性,而不是创建新对象:

var x = items.reduce((acc, item) => { 
    acc[item.id] = item;
    return acc;
}, {});

这是一个 O(n) 过程(n 是数组中的项目数)。

【讨论】:

  • 确实是这样,但升级前用同样的数据速度很快!感谢您提供替代代码。
  • @nkms 我不太了解您的应用程序中发生了什么;可能是项目数量增加了很多。 (我什至不知道“项目”是什么。)
  • @nkms 500ms 对我来说似乎是很多处理时间。不必要地创建所有这些新对象,以及重复复制和重新复制所有这些属性,通常是一种不太理想的做事方式。
  • 可以提出一个很好的反模式问题。在使用 reduce 的 SO 答案中经常看到它,可能是因为 "spread is cool" 并且可以使用它使更精简的代码隐式返回
  • @charlietfl 是的,包括“我想使用传播”的问题让我有点头疼,还有“我想使用箭头函数”
猜你喜欢
  • 2013-07-13
  • 2015-03-17
  • 2017-03-16
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多