দ্রুততম সমাধান?
আমি কয়েকটি মানদণ্ড চালিয়েছি এবং এই সমাধানটি বিশালভাবে জিতেছে: 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
অনুসন্ধানগুলি আরও জটিল এবং স্ট্রিং অনুসন্ধানগুলির চেয়ে ধীর।
- আপনার যদি ইতিমধ্যে একটি অ্যারে থাকে তবে ডিস্ট্রাকচারিং অ্যারেগুলি স্পষ্টভাবে সূচিকাগুলির তুলনায় তত দ্রুত এবং দুর্দান্ত দেখায়।
প্রথম উদাহরণ ছাড়িয়ে অপসারণ করা
এখানে এমন একটি সমাধান রয়েছে যা নবম উদাহরণ সহ স্লাইস হয়ে যাবে। এটি ততটা দ্রুত নয়, তবে ওপির প্রশ্নে gobble(element, '_', 1)
এখনও একটি RegExp
বা split
সমাধানের চেয়ে 2x দ্রুত এবং আরও কিছু করতে পারে:
/*
`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 এ পরীক্ষা করা হয়েছিল T