Найшвидше рішення?
Я провів деякі орієнтири , і це рішення виграло надзвичайно: 1
str.slice(str.indexOf(delim) + delim.length)
// as function
function gobbleStart(str, delim) {
return str.slice(str.indexOf(delim) + delim.length);
}
// as polyfill
String.prototype.gobbleStart = function(delim) {
return this.slice(this.indexOf(delim) + delim.length);
};
Порівняння продуктивності з іншими рішеннями
Єдиним близьким суперником був той самий рядок коду, за винятком використання substr
замість slice
.
Інші рішення, які я спробував включити split
або RegExp
взяли великий удар, і були приблизно на 2 порядки повільніше. Використання join
результатів split
, звичайно, додає додатковий штрафний показник.
Чому вони повільніші? Кожен раз, коли має бути створений новий об’єкт або масив, JS повинен запитати шматок пам'яті в ОС. Цей процес відбувається дуже повільно.
Ось декілька загальних рекомендацій, якщо ви переслідуєте орієнтири:
- Нові динамічні розподіли пам’яті для об’єктів
{}
або масивів []
(на зразок того, який split
створюється) коштуватимуть дорого у продуктивності.
RegExp
пошук складніший і, отже, повільніший, ніж рядковий пошук.
- Якщо у вас вже є масив, деструктивні масиви проходять так само швидко, як явно їх індексувати, і виглядають приголомшливо.
Виведення за межі першої інстанції
Ось рішення, яке розріже до і включить n-й екземпляр. Це не зовсім так швидко, але на питання , що ОП, в gobble(element, '_', 1)
ще> 2 рази швидше , ніж RegExp
або split
розчину і може зробити більше:
/*
`gobble`, given a positive, non-zero `limit`, deletes
characters from the beginning of `haystack` until `needle` has
been encountered and deleted `limit` times or no more instances
of `needle` exist; then it returns what remains. If `limit` is
zero or negative, delete from the beginning only until `-(limit)`
occurrences or less of `needle` remain.
*/
function gobble(haystack, needle, limit = 0) {
let remain = limit;
if (limit <= 0) { // set remain to count of delim - num to leave
let i = 0;
while (i < haystack.length) {
const found = haystack.indexOf(needle, i);
if (found === -1) {
break;
}
remain++;
i = found + needle.length;
}
}
let i = 0;
while (remain > 0) {
const found = haystack.indexOf(needle, i);
if (found === -1) {
break;
}
remain--;
i = found + needle.length;
}
return haystack.slice(i);
}
З вищенаведеним визначенням, gobble('path/to/file.txt', '/')
дав би ім'я файлу та gobble('prefix_category_item', '_', 1)
видалив би префікс, як і перше рішення у цій відповіді.
- Тести проводилися в Chrome 70.0.3538.110 на macOSX 10.14.