带有 If 语句的循环运行缓慢,太慢

Loop with If-statement runs slow, too slow

我是 JavaScript 的新手。我用它为 Adob​​e Illustrator 编写一些脚本。 在这个脚本中,我采用了 selection 项目,并通过一些用户定义的值(xPointMin、xPointMax 等)对它们进行子select。下面的循环是函数的主要部分。

我的问题是这个循环非常慢。这需要几秒钟。到 运行 50 个项目的 selection。

我已经尝试过以下方法:

  1. 运行 内部没有任何 if 条件的循环。这很快。
  2. 运行 内部只有一个 if 条件的循环。这与所有 if 条件一样快。

有人知道为什么它这么慢,或者有人可以让它更快。

// xArray... are extracted vales from the Selection (xSel)
// xPointMin, xPointmax, xLengthMin, xLengthMay, xAreaMin, and xAreaMax are user defined values

for (var i in xSel) { // xSel is a list of selected items
  var xTF = true; // xTF is temporary variable

  // points // this will check if the given value (xArrayPoint) is within the requirements
  if (xArrayPoint[i] <= xPointMin || xArrayPoint[i] >= xPointMax) {
    xTF = false; // if so it sets the temporary variable to false
  }

  //length // same as in the first check, however we are testing the length
  if (xArrayLength[i] <= xLengthMin || xArrayLength[i] >= xLengthMax) {
    xTF = false
  }
  //area // same as in the first check, however this time we are testing area
  if (xArrayArea[i] <= xAreaMin || xArrayArea[i] >= xAreaMax) {
    xTF = false
  }

  xSel[i].selected = xTF; // changes the original value
}
}

如果循环很小,你不会明白为什么要花这么长时间,但条件语句没有多大意义,例如:

if (xArrayPoint [i] <= xPointMin || xArrayPoint [i]> = xPointMax)

这显然是正确的,要么一个值大于另一个值要么小于等于另一个值,只有这3种可能性,它的ifs等同于if (true)。

可能会有所不同(但我不确定 javascript 中的那个)是在循环内创建变量,也许在必须分配 space 在内存中保存此数据。

例如在变量中搜索值时优化很多的东西是 binary search algorithm,这是非常简单的东西。 比如说你要在一个数组中查找某个值,二分查找的思想是首先将这些值按升序排列,然后将你要比较的值与该数组的中间值进行比较,如果它的值例如高于中间值(较小是同一个想法),它将与数组的最高值和数组的平均值之间的平均值进行比较,即除以一分为二的数组,直到找到要查找的值。

下面的代码可以为您节省很多时间

array1.forEach(i => 
    xSel[i].selected = !(
        xArrayPoint[i] <= xPointMin || xArrayPoint[i] >= xPointMax || 
        xArrayLength[i] <= xLengthMin || xArrayLength[i] >= xLengthMax || 
        xArrayArea[i] <= xAreaMin || xArrayArea[i] >= xAreaMax
    )
);

让我们看看我们在这里做了什么。我们进行了两项重大更改

  1. 选择 forEach 而不是传统的 for:ForEach 被认为比传统的 for 循环更快,因为它们不需要在每次迭代时重新初始化。

  2. 将多个if条件简化为一个赋值语句:由于所有条件都在OR操作数下,tt不必遍历每个条件如果第一个条件为真strong text