[Javascript] String Count - Opciones y Rendimiento

Hoy descubrí un sitio web muy interesante, http://jsperf.com/, que permite elaborar casos de prueba y realizarles benchmark.



La función que probé es una muy simple: contar ocurrencias de un String dentro de otro.

Elaboré cuatro funciones (algunas en realidad las tomé de internet):


    

    /**
     *    Opción 1
     */
    function count1(string, subString, allowOverlapping) {  
      string += "";
      subString += "";
      if (subString.length <= 0) return string.length + 1;
    
      var n = 0,
        pos = 0;
      var step = (allowOverlapping) ? (1) : (subString.length);
    
      while (true) {
        pos = string.indexOf(subString, pos);
        if (pos >= 0) {
          n++;
          pos += step;
        } else break;
      }
      return (n);
    }
    
    /**
     *    Opción 2 (split, no recomendado)
     */
    function count2(string, subString) {
      return string.split(subString).length - 1;
    }
    
    /**
     *    Opción 3
     */
    function count3(string, subString) {
        var count, index;
        for (count = -1, index = 0; index != -1; count++, index = string.indexOf(subString, index + 1));
        return count;
    }
    
    /**
     *    Opción 4 (regex)
     */
    function count4(string, subString) {
        var r = new RegExp(subString, "g");
        return (string.match(r)||[]).length;
    }


Los resultados fueron los siguientes:

  • La opción 1 y 3 tienen similar rendimiento. 
  • Estas son opciones "intermedias", muy estables en cuanto al rendimiento entre diferentes navegadores. La opción 2 en chrome tiene un rendimiento excepcional, y en los otros browsers no tanto.
  • La desventaja de esta es la cantidad de memoria que implica dividir un string en sub-strings. 
  • La opción 4 es mejor solo en chrome.

Resultados de http://jsperf.com/str-count en la fecha 15/10/2013

Puede chequear los resultados y probarlo en su navegador favorito en:


Comentarios

Entradas populares de este blog