【发布时间】: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 < n; i++)) 的性能更高。尽管考虑到循环需要多长时间,但您将在这里从沉没的泰坦尼克号中舀出一杯水。如果没有更多信息(比如mod_period1是什么),很难给出任何可靠的建议。 -
mod_period1比 mod_period 大吗?如果是,那么你循环太远了......你可以了解它下的其他索引吗?如果没有,为什么要浪费 cpu ......硬件让它变得更好真的取决于你如何使用它。 -
mod_period1 = mod_period + 1 => 是整数,其中 mod_period1 是筛子的大小。它是从 1 而不是 0 开始计数的调整/转变。
标签: javascript arrays performance google-chrome-devtools