Самый быстрый и короткий способ получить текст до первого пробела?
var str = 'lorem ipsum dolor'; // Моя реализация: var word = str.slice(0,str.indexOf(' ')) Как еще можно? |
Teamur,
var str = 'lorem ipsum dolor'; var word = str.split(" ")[0]; alert(word); |
Dilettante_Pro,
а мне, как обычно, пришло в голову сложное решение! Эх! |
Но! Если строка состоит из 10000 слов, разделенных пробелом, то метод 'split' будет обрабатывать гигантский текст, создавать массив и, наконец, брать первое слово.
А 'indexOf' работает до первого совпадения, следовательно, закончит в данном случае значительно быстрее. Может что-то еще есть? Или придется пойти на компромис 'длина кода/скорость' ) Наверное, решением будут регулярные выражения, в которых я не силен! |
var str = 'lorem ipsum dolor'; var word = str.substring(0,str.indexOf(' ')); var str = 'lorem ipsum dolor'; var word = str.substr(0,str.indexOf(' ')); |
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 |
Split так вообще черепаха, даже с такой короткой сточкой. Просто он не для этих целей.
|
j0hnik,
я и говорю 10000 слов и split - можно чай успеть попить ) |
Вариант через RegExp:
var word = /^.*?(?=\s)/.exec(str)[0]; var word = str.match(/^.*?(?=\s)/)[0]; |
с регексом проще тогда уж
var word = /^\S*/.exec(str)[0]; но indexOf всё равно быстрее. |
Вот еще вариант:
let s='lorem ipsum dolor',i,c=''; for(i of s){ if(i!=' '){ c=c+i } else break } alert(c) Но не знаю, да и не умею проверять код на скорость исполнения. Стыдно, что уж говорить ) |
Сделал чуть короче:
let s='lorem ipsum dolor',i,c=''; for(i of s){if(i==' ')break;c=c+i} alert(c) Ребят, а как вы проверяете код на скорость? Научите, пожалуйста. Просьба проверьте этот код. |
https://jsperf.com/
если акк на github есть то регистрироваться не надо. быстрей substring ты уже тут ничего не придумаешь, регулярки тоже не самый быстрый путь. |
https://jsperf.com/srfdjfjghdjghhf
посмотрите, все с этой темы в кучу собрал. тестировать RUN! |
j0hnik,
аккаунта нет, читал, что его создание настоящий геморой. По поводу substring. Напрашивается вопрос: Почему он быстрее чем slice, например? |
Ладно, пусть будет так:
substring быстрее, потому что более оптимизирован )) |
:)
fastest Testing in Firefox substr Testing in Chrome substring Testing in IE 11 slice Testing in Edge substring and substr |
Цитата:
на счет скорости в разных браузерах результаты могут отличаться, Рони прав тут. но в данный момент Хром у большинства населения, так что опираться лучше на него. Сам лично Оперой пользуюсь. Привычка с тех времен когда она лидировала и в скорости и по функционалу. |
j0hnik,
рони, в Mozilla, наверное, посчитали правильным заточить движок браузера под метод с более коротким именем:) |
Цитата:
|
Всем спасибо за помощь!
Решение: substr - Firefox, substring - Chrome, ... |
Цитата:
console.time('s'); var str = 'lorem ipsum dolor'; var word = str.slice(0,str.indexOf(' ')) console.timeEnd('s'); |
Цитата:
|
Цитата:
|
Цитата:
|
Rise,
Спасибо за метод. Добавил в копилку. Но я не пишу софт для запуска ракет в космос, поэтому объект консоль удобнее и привычнее, и с задачей для сравнения величин подходит. Большая точность мне не нужна. Цитата:
|
Да, метод slice удивил - даже моей регулярке проиграл (в Хроме).
|
Ага... Значит performance.now()
Rise,Будет ли достаточно этого метода? Просто не хочется изучать исходный код скрипта замера скорости с сайта https://jsperf.com/ |
Часовой пояс GMT +3, время: 16:26. |