【问题标题】:Javascript performance of boolean array counting布尔数组计数的Javascript性能
【发布时间】:2019-08-29 03:20:19
【问题描述】:

平台:Chrome 76。

当我遇到以下情况时,我正在进行性能测试。该应用程序运行附加(和之前的筛选)代码,重复数百万次。

t_sieve 是一个布尔数组,此时已被完全筛选。此代码位只是将 false 计数到 int 数组 t_match 中,这样在任何时候 t_match 将包含直到该数组索引的 'false 的数量。

对于随附的图像,代码大约需要 30 秒才能完成,其中 25 秒在这里发生。在此之前,筛分大约需要4s。

为什么?如何重构它以获得更好的性能?

另外仅供参考,我已经重复了性能分析,但始终是它滞后的地方。

紧随其后的块是对收到的 cmets 的更新。显示这些数组是如何被实例化的(比下面的代码块高一点)

const t_sieve = new Array( M_MAX + 1 ) ;
const t_match = new Array( M_MAX + 1 ) ;
let cum = 0;
for (let i = 1; i < mod_period1; i++) {
  if (!t_sieve[i]) {
    cum++;
  }
  t_match[i] = cum;
}
const period_match_count = t_match[mod_period];

【问题讨论】:

  • 您可以将您的代码添加为文本而不是图像吗?我们无法使用截屏代码。
  • 什么是mod_period1和mod_period??
  • 这只会带来非常小的性能提升,但通常负面的 while 循环 (while(i--)) 比 for 循环 (for(let i = 0; i &lt; n; i++)) 的性能更高。尽管考虑到循环需要多长时间,但您将在这里从沉没的泰坦尼克号中舀出一杯水。如果没有更多信息(比如 mod_period1 是什么),很难给出任何可靠的建议。
  • mod_period1 比 mod_period 大吗?如果是,那么你循环太远了......你可以了解它下的其他索引吗?如果没有,为什么要浪费 cpu ......硬件让它变得更好真的取决于你如何使用它。
  • mod_period1 = mod_period + 1 => 是整数,其中 mod_period1 是筛子的大小。它是从 1 而不是 0 开始计数的调整/转变。

标签: javascript arrays performance google-chrome-devtools


【解决方案1】:

我的一个想法是基于第 190 行花费大量时间。原因是当您在 JS 中向现有数组添加新元素时,它会再次重新创建整个数组。因此,每次添加新项目时,时间都会呈指数增长。查看性能截图:

这是与您的代码非常相似的代码。创建一个包含 100 万个真/假的数组,然后像您的一样计算它们。性能表现出非常相似的行为:大量时间花在第 21 行将新元素添加到数组中。

现在看看这个重组:

我将第 13 行替换为具有预定义长度的数组对象的实例化。查看第 21 行的运行速度快了多少。这是因为它已经有空间并且不必一直重建整个阵列。当然,有一个权衡。第 13 行花费的时间稍长,但如果您可以初始化一次大小,那么您将通过循环的每次迭代来弥补它。

【讨论】:

  • 您建议的方法是我如何实例化数组。我已将该代码块添加到 OP。即使使用这种方法,也能保持成比例的“缓慢”……这是我所观察到的。
  • 发布的性能配置文件是针对数组实例化的,我在代码中已经有了。
猜你喜欢
  • 2017-04-26
  • 2014-12-11
  • 2013-10-02
  • 2017-10-29
  • 2018-03-05
  • 2012-04-07
  • 2013-01-07
  • 2011-05-12
相关资源
最近更新 更多