Показать сообщение отдельно
  #1 (permalink)  
Старый 08.08.2013, 18:10
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

функция поиска
читаю книгу 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



разница в общем очень большая, либо я чего то не понимаю, или почему тогда автор использует такую медленную функцию (причем на сервере) ?
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием