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

У меня есть этот 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;
        }

Ответы [ 3 ]

10 голосов
/ 17 июня 2009

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

0 голосов
/ 17 июня 2009

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

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

0 голосов
/ 17 июня 2009

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

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

...