Вход

Просмотр полной версии : Самый быстрый и короткий способ получить текст до первого пробела?


Teamur
04.07.2017, 18:45
var str = 'lorem ipsum dolor';

// Моя реализация:

var word = str.slice(0,str.indexOf(' '))

Как еще можно?

Dilettante_Pro
04.07.2017, 19:08
Teamur,
var str = 'lorem ipsum dolor';
var word = str.split(" ")[0];
alert(word);

Teamur
04.07.2017, 19:14
Dilettante_Pro,
а мне, как обычно, пришло в голову сложное решение!
Эх!

Teamur
04.07.2017, 19:23
Но! Если строка состоит из 10000 слов, разделенных пробелом, то метод 'split' будет обрабатывать гигантский текст, создавать массив и, наконец, брать первое слово.
А 'indexOf' работает до первого совпадения, следовательно, закончит в данном случае значительно быстрее.

Может что-то еще есть? Или придется пойти на компромис 'длина кода/скорость' )

Наверное, решением будут регулярные выражения, в которых я не силен!

j0hnik
04.07.2017, 21:27
var str = 'lorem ipsum dolor';
var word = str.substring(0,str.indexOf(' '));

var str = 'lorem ipsum dolor';
var word = str.substr(0,str.indexOf(' '));

j0hnik
04.07.2017, 21:32
slice
var str = 'lorem ipsum dolor';
var word = str.slice(0,str.indexOf(' '));
13,713,840
±0.26%
80% slower


substring
var str = 'lorem ipsum dolor';
var word = str.substring(0,str.indexOf(' '));
69,007,394
±0.18%
fastest


substr
var str = 'lorem ipsum dolor';
var word = str.substr(0,str.indexOf(' '));
59,538,496
±0.17%
14% slower

ваш метод в данном случае на 80% медленнее substring

j0hnik
04.07.2017, 21:36
Split так вообще черепаха, даже с такой короткой сточкой. Просто он не для этих целей.

Teamur
05.07.2017, 00:29
j0hnik,
я и говорю 10000 слов и split - можно чай успеть попить )

ruslan_mart
05.07.2017, 03:45
Вариант через RegExp:

var word = /^.*?(?=\s)/.exec(str)[0];

var word = str.match(/^.*?(?=\s)/)[0];

Alexandroppolus
05.07.2017, 11:03
с регексом проще тогда уж
var word = /^\S*/.exec(str)[0];

но indexOf всё равно быстрее.

Teamur
05.07.2017, 20:03
Вот еще вариант:


let s='lorem ipsum dolor',i,c='';

for(i of s){
if(i!=' '){
c=c+i
} else break
}

alert(c)


Но не знаю, да и не умею проверять код на скорость исполнения. Стыдно, что уж говорить )

Teamur
05.07.2017, 20:18
Сделал чуть короче:

let s='lorem ipsum dolor',i,c='';

for(i of s){if(i==' ')break;c=c+i}

alert(c)


Ребят, а как вы проверяете код на скорость? Научите, пожалуйста.
Просьба проверьте этот код.

j0hnik
05.07.2017, 20:22
https://jsperf.com/
если акк на github есть то регистрироваться не надо.

быстрей substring ты уже тут ничего не придумаешь, регулярки тоже не самый быстрый путь.

j0hnik
05.07.2017, 20:43
https://jsperf.com/srfdjfjghdjghhf
посмотрите, все с этой темы в кучу собрал. тестировать RUN!

Teamur
05.07.2017, 20:46
j0hnik,
аккаунта нет, читал, что его создание настоящий геморой.

По поводу substring. Напрашивается вопрос:
Почему он быстрее чем slice, например?

Teamur
05.07.2017, 20:57
Ладно, пусть будет так:
substring быстрее, потому что более оптимизирован ))

рони
05.07.2017, 20:59
:)
fastest
Testing in Firefox substr
Testing in Chrome substring
Testing in IE 11 slice
Testing in Edge substring and substr

j0hnik
05.07.2017, 21:09
j0hnik,
аккаунта нет, читал, что его создание настоящий геморой.


5 минут максимум;

на счет скорости в разных браузерах результаты могут отличаться, Рони прав тут.
но в данный момент Хром у большинства населения, так что опираться лучше на него.
Сам лично Оперой пользуюсь.
Привычка с тех времен когда она лидировала и в скорости и по функционалу.

Teamur
05.07.2017, 21:46
j0hnik,
рони,

в Mozilla, наверное, посчитали правильным заточить движок браузера под метод с более коротким именем:)

j0hnik
05.07.2017, 22:00
j0hnik,
рони,

в Mozilla, наверное, посчитали правильным заточить движок браузера под метод с более коротким именем:)
не думаю что все так просто.

Teamur
05.07.2017, 22:22
Всем спасибо за помощь!
Решение: substr - Firefox, substring - Chrome, ...

Rasy
05.07.2017, 23:12
Ребят, а как вы проверяете код на скорость? Научите, пожалуйста.
Далеко идти не надо

console.time('s');
var str = 'lorem ipsum dolor';
var word = str.slice(0,str.indexOf(' '))
console.timeEnd('s');

j0hnik
05.07.2017, 23:49
Далеко идти не надо

console.time('s');
var str = 'lorem ipsum dolor';
var word = str.slice(0,str.indexOf(' '))
console.timeEnd('s');

слишком неточный метод, разброс от 0.011 до 0.02.

Rasy
06.07.2017, 00:19
слишком неточный метод, разброс от 0.011 до 0.02.
Ну это не точно

laimas
06.07.2017, 08:10
Решение: substr - Firefox, substring - Chrome, ...

Ладно пусть ищем в тексте с самым длинным словом, которое вроде бы связано с названием белка и что-то более тысячи символов и поэтому заморачиваемся сколько мы потеряем на производительности, а на то, что надо еще проверить что-то за браузер и какой метод применить не обращаем внимания. Ну выигрывать тысячные доли в слове максимум 20 символов, это уже болезнь. )

Rasy
06.07.2017, 09:41
Rise,
Спасибо за метод. Добавил в копилку. Но я не пишу софт для запуска ракет в космос, поэтому объект консоль удобнее и привычнее, и с задачей для сравнения величин подходит. Большая точность мне не нужна.
это уже болезнь. )

от праздности)

Alexandroppolus
06.07.2017, 10:34
Да, метод slice удивил - даже моей регулярке проиграл (в Хроме).

Teamur
06.07.2017, 18:46
Ага... Значит performance.now()

Rise,Будет ли достаточно этого метода?
Просто не хочется изучать исходный код скрипта замера скорости с сайта https://jsperf.com/