Solusi tercepat?
Saya menjalankan beberapa tolok ukur , dan solusi ini menang sangat besar: 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);
};
Perbandingan kinerja dengan solusi lain
Satu-satunya pesaing dekat adalah baris kode yang sama, kecuali menggunakan substr
bukan slice
.
Solusi lain yang saya coba libatkan split
atau RegExp
mengalami kinerja besar dan sekitar 2 kali lipat lebih lambat. Menggunakan join
pada hasil split
, tentu saja, menambah penalti kinerja tambahan.
Mengapa mereka lebih lambat? Setiap kali objek atau array baru harus dibuat, JS harus meminta sepotong memori dari OS. Proses ini sangat lambat.
Berikut adalah beberapa pedoman umum, jika Anda mengejar tolok ukur:
- Alokasi memori dinamis baru untuk objek
{}
atau array []
(seperti yang dibuat split
) akan membutuhkan banyak biaya dalam kinerja.
RegExp
pencarian lebih rumit dan karena itu lebih lambat daripada pencarian string.
- Jika Anda sudah memiliki larik, merusak susunan array akan secepat pengindeksan mereka secara eksplisit, dan terlihat mengagumkan.
Menghapus di luar instance pertama
Inilah solusi yang akan mengiris hingga dan memasukkan instance ke-n. Ini tidak secepat, tetapi pada pertanyaan OP, gobble(element, '_', 1)
masih> 2x lebih cepat dari solusi RegExp
atau split
dan dapat melakukan lebih banyak:
/*
`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);
}
Dengan definisi di atas, gobble('path/to/file.txt', '/')
akan memberikan nama file, dan gobble('prefix_category_item', '_', 1)
akan menghapus awalan seperti solusi pertama dalam jawaban ini.
- Pengujian dijalankan di Chrome 70.0.3538.110 di macOSX 10.14.