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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глупый вопрос о производительности, indexOf() vs. split() + цикл 
V
    Опции темы
SelenIT
Дата 20.11.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Есть строка - список значений через запятую (var str="30,50,55"). Есть отдельное значение (var val="50"). Как лучше проверить, есть ли это значение в строке: так
Код

function check(val) {
   var tmp = str.split(',');
   for (var i=0;i<tmp.length;i++) if (tmp[i] == val) return true;
   return false;
}
или так?
Код

function check(val) {
   return ((','+str+',').indexOf(','+val+',')>=0);
}

(прошу прощения, если вопрос идиотский - вот на ровном, казалось бы, месте сомнения замучили...)


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


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



мне кажется, что при первом алгоритме мы пробегаем по всей строке дважды: первый раз при разбиении, второй раз - при поиске в цикле.
при использовании второго алгоритма по строке пробегаем только один раз. 
PM MAIL   Вверх
SelenIT
Дата 20.11.2006, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



skyboy, спасибо. Мне самому тоже кажется, что вариант без цикла рациональнее и "красивее". Но в одном весьма уважаемом и солидном проекте наткнулся именно на первый вариант, и решил проверить свою интуицию - вдруг я "по обыкновению" что-то очень важное и притом общеизвестное упустил...

Upd: вопрос пока не закрыт, еще надеюсь услышать аргументы в защиту первого способа и/или что-нибуль третье, еще более оптимальное smile

Это сообщение отредактировал(а) SelenIT - 20.11.2006, 23:57


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


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


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

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



Все, с помощью следующего теста вопрос окнчательно решен в пользу второго варианта.
Код

var n = [];
for (var i=0; i<500000; i++) {
   n[i] = parseInt(Math.random()*1000)
}
var str = n.join(',');

//document.write(str);

var test = '5055'; //  заведомо не найдется => будет полный перебор

function check0(val) {
   var tmp = str.split(',');
   for (var i=0,l=tmp.length;i<l;i++) if (tmp[i] == val) return true;
   return false;
}

function check1(val) {
   return ((','+str+',').indexOf(','+val+',')>=0);
}

var t0 = new Date();
var test1 = check0(test);
var t1 = (new Date()) - t0

var t0 = new Date();
var test2 = check1(test);
var t2 = (new Date()) - t0

alert([t1, t2])


Типичные результаты: IE6 - 1300, 380; FF2 - 3000, 15; Opera 9 - 3000, 47. А с меньшим числом элементов списка второй способ в FF2 вообще не попадал в "разрешение" Date() - показывал 0...


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


 




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


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

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