Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   функция поиска (https://javascript.ru/forum/misc/40515-funkciya-poiska.html)

cyber 08.08.2013 18:10

функция поиска
 
читаю книгу Node.js Разработка серверных веб-приложений на JavaScript

и в книги встретил функцию поиск в массиве, которая выглядит так

var checkRegexp  = function () {
         
      
        for(var i = 0; i < tObj.length; i++) {
         
         var container =  tObj[i];
         var hostMatches = host.toLowerCase().match(container.host);
         var pathMatches = path.match(container.path);
          
          
          if(hostMatches !== null && pathMatches !== null) {
          
            return {
             
              container: container,
              host: hostMatches,
              path: pathMatches 
            
            }
          
          }
          
          
        }
          
          return undefined;
        
        }


сразу видно что поиск довольно медленный.
стало интересно на сколько оптимальней через indexOf, сделал тест
var tObj = [],
         leng,
         host = "test",
         path = 'test.com';
      
      
      
      for(var i = 0; i < 20;i++) {
         
        tObj.push({
        
          host: Math.random(),
          path: Math.random()
        })
      
      }
      
      tObj.push({
        
          host: host,
          path: path
        })
      
      
      leng = tObj.length;
      
      var test = function (fnc, count) {
      
         var d = new Date;
        
        
        for(var i = 0; i < count; i++) 
            fnc();
      
      
        return new Date - d;
      }
  
      
      
      
      var checkRegexp  = function () {
         
      
        for(var i = 0; i < tObj.length; i++) {
         
         var container =  tObj[i];
         var hostMatches = host.toLowerCase().match(container.host);
         var pathMatches = path.match(container.path);
          
          
          if(hostMatches !== null && pathMatches !== null) {
          
            return {
             
              container: container,
              host: hostMatches,
              path: pathMatches 
            
            }
          
          }
          
          
        }
          
          return undefined;
        
        }
      
      
      
      
      
      
      
      var checkIndex = function () {
      
        
        for(var i = 0; i < leng; i++) {
          
        var container = tObj[i],
            hostMatches = ~host.toLowerCase().indexOf(container.host),
            pathMatches = ~path.indexOf(container.path);
          
          
          if(hostMatches && pathMatches ) {
            
 
            
            return {
             
              container: container,
              host: container.host,
              path: container.path
            
            }
          
          }
          
        
      }
      
        
    }
       
         
      console.log(test(checkIndex, 1000)); // 6
      
       console.log(test(checkRegexp, 1000)); // 680



разница в общем очень большая, либо я чего то не понимаю, или почему тогда автор использует такую медленную функцию (причем на сервере) ?

cyber 09.08.2013 19:15

up

cyber 10.08.2013 17:41

Цитата:

Сообщение от Дзен-трансгуманист
Почему гоняем один и тот же host.toLowerCase() в цикле?

зачем вообще lowerCase, если можно использовать регистронезависимый поиск

nerv_ 10.08.2013 17:50

Цитата:

Сообщение от cyber
разница в общем очень большая, либо я чего то не понимаю, или почему тогда автор использует такую медленную функцию (причем на сервере) ?

автор был не в себе (или пьян) :) А вообще, Дзен-трансгуманист, уже ответил


Часовой пояс GMT +3, время: 04:37.