Медленный пользовательский скрипт GAS - PullRequest
1 голос
/ 26 мая 2020

Итак, я написал (из-за отсутствия ответов + улучшения моих навыков) сценарий поиска, который будет делать в основном то, что делает .indexOf.

function search(ref, data) {

  var x
  var y
  var result = []

  if (data == '' || data == null) {
  } else {
    for (x = 0; x < data.length; x++) {
      if (data[x] == ref[0]) {                //achando match inicial
        var proto = [];
        for (y = 0; y < ref.length; y++) {
          if (data[x+y] == ref[y]) {          //gravando tentativas de match completo
          proto.push(data[x+y])
          }
        }
        var proto2 = proto.join('')
        if (proto2 == ref) {                   //testando match completo
            result.push(x)
        }
      }
    }
  }
  if (result == '' || result == null) {
  } else {
    return result[0]
  }
}

Он отлично работает с другими небольшими кодами и пользовательскими функциями которые не требуют слишком большого количества циклов, но когда я написал более надежный сценарий, я обнаружил, что мой код примерно в 3000 раз медленнее, чем собственный .indeOf.

Почему я должен столкнуться с такой разницей?

1 Ответ

1 голос
/ 28 мая 2020

Проблема:

Ваша функция сравнивает каждый символ из ref отдельно с символом data во внутреннем l oop, помещая каждое совпадение символа внутри массива (proto) и используя join, чтобы преобразовать массив обратно в строку (proto2), прежде чем сравнивать его с исходным ref.

Это крайне неэффективно и может быть значительно упрощено, поэтому, несомненно, эта функция намного медленнее, чем String.prototype.indexOf () .

Решение:

Вместо этого у вас может быть один l oop, итерация через data, и для каждой итерации извлекать срез из data той же длины, что и ref, прежде чем сравнивать это ломтик с ref. Если оба значения совпадают, строка ref была найдена в data, и был возвращен соответствующий индекс:

function searchString(ref, data) {
  for (let i = 0; i <= data.length - ref.length; i++) {
    if (ref === data.slice(i, i + ref.length)) return i;
  }
  return -1;
}

При использовании этой функции я получаю такое же время выполнения, как и при indexOf.

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...