सबसे तेज उपाय?
मैंने कुछ बेंचमार्क चलाए , और इस समाधान ने बेहद जीत हासिल की: 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, ज़ाहिर है, एक अतिरिक्त प्रदर्शन जुर्माना कहते हैं।
वे धीमे क्यों हैं? किसी भी समय एक नई वस्तु या सरणी बनाई जानी चाहिए, जेएस को ओएस से मेमोरी का एक हिस्सा अनुरोध करना होगा। यह प्रक्रिया बहुत धीमी है।
यदि आप बेंचमार्क का पीछा कर रहे हैं, तो यहां कुछ सामान्य दिशानिर्देश दिए गए हैं:
- वस्तुओं
{}या सरणियों [](जैसे जो splitबनाता है) के लिए नया गतिशील मेमोरी आवंटन प्रदर्शन में बहुत अधिक खर्च करेगा।
RegExp खोज अधिक जटिल हैं और इसलिए स्ट्रिंग खोजों की तुलना में धीमी हैं।
- यदि आपके पास पहले से ही एक सरणी है, तो विनाशकारी सरणियाँ लगभग उतनी ही तेजी से हैं जितना स्पष्ट रूप से उन्हें अनुक्रमणित करता है, और भयानक दिखता है।
पहले उदाहरण से परे हटना
यहाँ एक समाधान है कि nth उदाहरण के लिए और सहित टुकड़ा होगा। यह बहुत तेज़ नहीं है, लेकिन ओपी के सवाल पर, gobble(element, '_', 1)अभी भी> 2x एक 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)इस उत्तर में पहले समाधान की तरह उपसर्ग को हटा देगा।
- MacOSX 10.14 पर क्रोम 70.0.3538.110 में टेस्ट चलाए गए।