Какая более высокая производительность используется в больших циклах: .indexOf (str) или .match (regex)?

StackOverflow https://stackoverflow.com/questions/1008364

Вопрос

У меня есть этот array.prototype на моей странице, и он, похоже, отнимает много времени на обработку:

        Array.prototype.findInArray = function(searchStr) {
          var returnArray = false;
          for (i=0; i<this.length; i++) {
            if (typeof(searchStr) == 'function') {
              if (searchStr.test(this[i])) {
                if (!returnArray) { returnArray = [] }
                returnArray.push(i);
              }
            } else {
              var regexp = new RegExp(".*" + searchStr + ".*");
              if (this[i].match(regexp)) {
                if (!returnArray) { returnArray = [] }
                returnArray.push(i);
              }
            }
          }
          return returnArray;
        }
Это было полезно?

Решение

Прежде всего, вы знаете, что вам не нужно иметь ". * " по обе стороны, верно? Регулярное выражение уже по умолчанию будет соответствовать в любом месте строки. Во-вторых, если вы просто ищете постоянную строку и вам не нужно использовать какие-либо дополнительные возможности, предлагаемые регулярными выражениями, тогда определенно быстрее использовать .indexOf () . Кроме того, вам не придется беспокоиться о экранировании символов, имеющих особое значение.

Другие советы

Регулярные выражения могут сильно отличаться. Я полагаю, что простое, хорошо составленное регулярное выражение может работать быстрее или быстрее, чем indexOf (). С другой стороны, сложному регулярному выражению потребуется больше времени, поскольку оно выполняет больше работы.

У вас также есть проблема с реализацией браузера, которая мешает. Если не считать временной цикл для измерения времени, которое требуется каждому браузеру для выполнения каждого типа обнаружения с учетом ваших конкретных потребностей, вы не сможете получить надежный ответ.

Что еще хуже, вы создаете новый объект регулярного выражения на каждой итерации цикла. определите его один раз за пределами цикла или передайте в качестве аргумента.

Кроме того, для этого использования test лучше и быстрее, чем match .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top