带有 If 语句的循环运行缓慢,太慢
Loop with If-statement runs slow, too slow
我是 JavaScript 的新手。我用它为 Adobe Illustrator 编写一些脚本。
在这个脚本中,我采用了 selection 项目,并通过一些用户定义的值(xPointMin、xPointMax 等)对它们进行子select。下面的循环是函数的主要部分。
我的问题是这个循环非常慢。这需要几秒钟。到 运行 50 个项目的 selection。
我已经尝试过以下方法:
- 运行 内部没有任何 if 条件的循环。这很快。
- 运行 内部只有一个 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
)
);
让我们看看我们在这里做了什么。我们进行了两项重大更改
选择 forEach 而不是传统的 for:ForEach 被认为比传统的 for 循环更快,因为它们不需要在每次迭代时重新初始化。
将多个if条件简化为一个赋值语句:由于所有条件都在OR操作数下,tt不必遍历每个条件如果第一个条件为真strong text
我是 JavaScript 的新手。我用它为 Adobe Illustrator 编写一些脚本。 在这个脚本中,我采用了 selection 项目,并通过一些用户定义的值(xPointMin、xPointMax 等)对它们进行子select。下面的循环是函数的主要部分。
我的问题是这个循环非常慢。这需要几秒钟。到 运行 50 个项目的 selection。
我已经尝试过以下方法:
- 运行 内部没有任何 if 条件的循环。这很快。
- 运行 内部只有一个 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
)
);
让我们看看我们在这里做了什么。我们进行了两项重大更改
选择 forEach 而不是传统的 for:ForEach 被认为比传统的 for 循环更快,因为它们不需要在每次迭代时重新初始化。
将多个if条件简化为一个赋值语句:由于所有条件都在OR操作数下,tt不必遍历每个条件如果第一个条件为真strong text