L oop с оператором If выполняется медленно, слишком медленно - PullRequest
1 голос
/ 29 апреля 2020

Я новичок в JavaScript. Я использую его для написания некоторых скриптов для Adobe Illustrator. В этом сценарии я выбираю элементы и выбираю их по определенным пользователем значениям (xPointMin, xPointMax и т. Д. c.). L oop ниже является основной частью функции.

Моя проблема в том, что этот l oop ужасно медленный. Требуется несколько се c. запустить выбор из 50 предметов.

Я уже попробовал следующее:

  1. запустить l oop без каких-либо условий if внутри. Это быстро.
  2. запустите l oop только с одним условием 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
}
}

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Следующий код может сэкономить вам много времени

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 по сравнению с традиционным для : ForEach считается более быстрым, чем традиционный для циклов, поскольку они не требуют повторной инициализации при каждом итерация.

  2. Упрощение нескольких условий if для одного оператора присваивания : поскольку все условия находятся под операндами OR, tt не должен go через каждое условие, если первое условие истинно сильный текст

0 голосов
/ 29 апреля 2020

Если l oop мало, вы не поймете, почему это занимает много времени, но условия не имеют особого смысла, например:

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

Это, безусловно, верно, либо одно значение больше другого, либо меньше или равно другому, есть только эти 3 возможности, его ifs эквивалентны to if (true).

Что-то, что может иметь значение (но я не уверен насчёт этого в javascript) - это создание переменных внутри al oop, возможно, это будет дорого с точки зрения обработка для того, чтобы выделить место в памяти для сохранения этих данных.

Что-то, что оптимизирует многое при поиске значений в переменных, например, это алгоритм двоичного поиска , который является чем-то очень просто. Скажем, например, что вы хотите найти определенное значение в массиве, идея бинарного поиска основана на том, чтобы сначала поместить эти значения в порядке возрастания и сравнить сравниваемое значение с промежуточным значением этого массива. если его значение, например, выше, чем промежуточное значение (меньшая - та же идея), оно будет сравниваться со средним значением, которое находится между наибольшим значением массива и средним значением массива, то есть будет делить массив в два, пока не найдет искомое значение.

...