Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск подстроки, как ускорить 
:(
    Опции темы
31416
Дата 4.11.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



вообщем есть текстовый фильтр который работает на js
суть в следующем - с сервера подгружается список некоторых объектов (текстовые строки)
далле юзер может фильтровать эти строки - вводит некоторый текст и откидываются строки которые НЕ содержат его (текст юзера) как подстроку.

все совдится к тому что эта ф-я:

        var text_filter = function check_filter(text, search)
        {                    
            
            if(text.toLowerCase().indexOf(search.toLowerCase()) + 1)
                return true;                            
            
            return false;
        }

вызывается примерно по циклу для пары сотен строк, так вот это очень медленно работает
если строк скажем несколько сотен. 

я так понимаю что скорее всего медленно работает indexOf.. и нужно искать какую то ему альтернативу...

 подскажите как ускорить?
--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
Michael.de
Дата 4.11.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 2
Всего: 9



31416, если передавать в ф-цию вместо search уже готовый search.toLowerCase(), то выполнение чуть ускорится (я добавил else):
Код

...
search=search.toLowerCase();
...
var text_filter = function check_filter(text, search){
 if (text.toLowerCase().indexOf(search + 1) return true;
 else return false;
}

можно поэкспериментировать и вытащить check_filter() в отдельную ф-цию:
Код

var text_filter = check_filter(tvoj_text, tvoj_search);
...
function check_filter(text, search){
 if (text.toLowerCase().indexOf(search + 1) return true;
 else return false;
}

P.S. можно ещё короче... вместо:
Код

...
 if (text.toLowerCase().indexOf(search + 1) return true;
 else return false;
...
использовать
Код

...
 text.toLowerCase().indexOf(search + 1) ? return true : return false;
...
 smile
P.P.S. единственное, что не понял... что делает между скобок +1: indexOf(search + 1) ?


Это сообщение отредактировал(а) Michael.de - 4.11.2008, 19:44
PM MAIL   Вверх
SelenIT
Дата 4.11.2008, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(Michael.de @  4.11.2008,  19:38 Найти цитируемый пост)
что делает между скобок +1

Видимо, превращает -1 в 0, а 0 в 1 - для получения однозначного булевского рез-та smile

Хотя, конечно, и короче, и логичнее было бы написать это как
Код

function check_filter(text, search){
   return (text.toLowerCase().indexOf(search) != -1);
}




--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Michael.de
Дата 4.11.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 346
Регистрация: 22.3.2005
Где: Deutschland

Репутация: 2
Всего: 9



Цитата(SelenIT @  4.11.2008,  20:12 Найти цитируемый пост)
Видимо, превращает -1 в 0, а 0 в 1 - для получения однозначного булевского рез-та 

упс, это я скобку пропустил, надо было так:
Код

text.toLowerCase().indexOf(search) + 1) ? return true : return false;

PM MAIL   Вверх
lusever
Дата 4.11.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 12.4.2007

Репутация: 2
Всего: 3



Регулярное выражение тут будет работать быстрее:
Код

var rex = new RegExp(search, 'im')
check_filter(text, rex)
function check_filter(text, rex)
{
  return rx.test(text)
}

Регексп конечно же лучше кэшировать и эскейпить.
PM MAIL WWW   Вверх
IDVsbruck
Дата 5.11.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Однозначно регулярка! И проще, и гораздо шустрее ...
PM MAIL   Вверх
31416
Дата 5.11.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



да, спасибо! попробвал регулярку стало более менее, хотя все-равно чувствуется на больших объекмах..
тут советовали еще соединить все строки в одну, и сразу одним применением регулярки
отобрать нужные - было бы скорее всего еще быстрее,чем по циклу, но пока и так устраивает)
--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
IDVsbruck
Дата 5.11.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Если объем текста очень приличный, то может быть эффективней отдать это серверу - отдавать ему вводимый пользователем текст и разбирать на серваке, а клиенту возвращать только требуемое.
PM MAIL   Вверх
mxt
Дата 7.11.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 6.9.2007

Репутация: нет
Всего: 1



возможно нужно оптимизировать, но не только тут,


у вас примерно такой план работы:
1. задаются параметры фильтра,
2. Фильтруются строки
3, Вывод отфильтрованных данных пользователю.


Возможно нужно проводить оптимизацию в 3 пункте?

--------------------
PM MAIL   Вверх
31416
Дата 15.11.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 3.5.2006

Репутация: нет
Всего: нет



IDVsbruck, да чего то не хочется сервер такими задачами напрягать..

mxt, а какая там в 3-ем может быть оптимизация? там просто хтмл строится и все
--------------------
Мой блог
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0700 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.