Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Самый быстрый и короткий способ получить текст до первого пробела? (https://javascript.ru/forum/misc/69585-samyjj-bystryjj-i-korotkijj-sposob-poluchit-tekst-do-pervogo-probela.html)

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

Цитата:

Сообщение от Teamur (Сообщение 457662)
j0hnik,
аккаунта нет, читал, что его создание настоящий геморой.

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

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

Teamur 05.07.2017 21:46

j0hnik,
рони,

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

j0hnik 05.07.2017 22:00

Цитата:

Сообщение от Teamur (Сообщение 457673)
j0hnik,
рони,

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

не думаю что все так просто.

Teamur 05.07.2017 22:22

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

Rasy 05.07.2017 23:12

Цитата:

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

Далеко идти не надо
console.time('s');
var str = 'lorem ipsum dolor';
var word = str.slice(0,str.indexOf(' '))
console.timeEnd('s');

j0hnik 05.07.2017 23:49

Цитата:

Сообщение от Rasy (Сообщение 457680)
Далеко идти не надо
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

Цитата:

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

Ну это не точно

laimas 06.07.2017 08:10

Цитата:

Сообщение от Teamur
Решение: substr - Firefox, substring - Chrome, ...

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

Rasy 06.07.2017 09:41

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

Сообщение от laimas
это уже болезнь. )

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

Alexandroppolus 06.07.2017 10:34

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

Teamur 06.07.2017 18:46

Ага... Значит performance.now()

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


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