কোনও স্ট্রিংয়ে প্রথম চরটি সরিয়ে ফেলার দ্রুততম উপায়


207

বলুন আমাদের নীচের স্ট্রিং রয়েছে

string data= "/temp string";

আমরা যদি প্রথম চরিত্রটি মুছে ফেলতে চাই তবে আমরা /অনেকগুলি উপায়ে করতে পারি যেমন:

data.Remove(0,1);
data.TrimStart('/');
data.Substring(1);

তবে, সত্যিই আমি জানি না কোন একটিতে সবচেয়ে ভাল অ্যালগরিদম আছে এবং এটি দ্রুত করে চলেছে ..
এমন একটি আছে যা সেরা বা সবগুলি একই রকম?


আপনি কি তবে যেভাবেই প্রথম চরিত্রটি মুছে ফেলতে চান বা আপনার এই চরিত্রটি সত্যই একটি কিনা তা পরীক্ষা করা দরকার /?
এসআরকেএক্স

5
TrimStartপ্রথম চরটি সরিয়ে ফেলবে না, এটি nশুরু থেকে অক্ষর সরিয়ে ফেলবে । Substringদ্রুততম হয়।
জারোস্লাভ জান্দেক

আমার কেবল কোনও প্রথম চরিত্রটি সরিয়ে ফেলতে হবে
আমর বাদোয়া

6
আপনি যদি কোনও প্রথম অক্ষর সরিয়ে TrimStart()ফেলেন তবে তা পুরোপুরি প্রশ্নের বাইরে।
বোল্টক্লক

@ বল্টক্লক: হ্যাঁ, আমি যা বলেছিলাম (টাইপ করা)।
জারোস্লাভ জান্দেক

উত্তর:


147

দ্বিতীয় বিকল্পটি সত্যই অন্যদের মতো নয় - যদি স্ট্রিংটি "/// foo" হয় তবে এটি "// foo" এর পরিবর্তে "foo" হয়ে যাবে।

তৃতীয়টির চেয়ে প্রথম বিকল্পটি বুঝতে আরও কিছু কাজ দরকার - আমি Substringবিকল্পটি সর্বাধিক সাধারণ এবং পঠনযোগ্য হিসাবে দেখতে চাই ।

(স্পষ্টতই তাদের পৃথক বিবৃতি হিসাবে প্রত্যেকে কার্যকর কোনও কাজ করবে না - আপনাকে ফলটি সম্ভবত একটি ভেরিয়েবলের কাছে অর্পণ করতে হবে data))

প্রকৃতপক্ষে এটি আপনার সমস্যা হয়ে না উঠলে আমি এখানে পারফরম্যান্সকে বিবেচনায় নেব না - এক্ষেত্রে আপনি কেবলমাত্র একমাত্র পরীক্ষার কেসগুলিই জানেন এবং তারপরে প্রতিটি বিকল্পের জন্য কেবলমাত্র সেই পরীক্ষাগুলি চালানো সহজ এবং ফলাফল তুলনা করুন। আমি Substringসম্ভবত এখানে দ্রুততম হওয়ার প্রত্যাশা করছিলাম , কেবলমাত্র কারণ Substringসর্বদা মূল ইনপুটটির একক অংশ থেকে একটি স্ট্রিং তৈরি শেষ হয়, যেখানে Removeকমপক্ষে সম্ভাব্যভাবে একসাথে একটি শুরুর অংশ এবং শেষ অংশ হতে হবে।


36
আমি এখন প্রত্যেককে 90000000 সম্পর্কে কল করে চেক করব এবং আমি নিম্নলিখিত ফলাফলটিতে চলেছি: সরান: 06.63 - ট্রিমস্টার্ট: 04.71 - সাবস্ট্রিং: 03.09 সুতরাং রেজাল্ট সাবস্ট্রিং থেকে সেরা
Amr Badawy

5
কেবল মনে রাখবেন যে আপনি যখন এইভাবে পারফরম্যান্স পরীক্ষা করছেন, আপনি সিপিইউ ক্যাশে দ্বারা প্রভাবিত হবেন, তাই আপনাকে এলোমেলো স্ট্রিংগুলিতে এটি করা দরকার যা আপনি একটি অ্যারে (তালিকা) দিয়ে প্রাক-জন-তৈরি করেছেন এবং এলোমেলোভাবে সেই অ্যারের উপাদানটি নির্বাচন করুন ( তালিকা)।
আজিহ

12

আমি জানি এটি হাইপার-অপটিমাইজেশন ল্যান্ড, তবে চাকার চাকাটি ভাল বাহানা বলে মনে হয়েছিল BenchmarkDotNet। এই পরীক্ষার ফলাফল (। নেট কোর এমনকি সমান) এই নমুনা পরীক্ষার Substringতুলনায় যে কখনও সামান্য দ্রুত হয় Remove: 19.37ns বনাম 22.52ns এর জন্য Remove। তাই কিছু 16% দ্রুত।

using System;
using BenchmarkDotNet.Attributes;

namespace BenchmarkFun
{
    public class StringSubstringVsRemove
    {
        public readonly string SampleString = " My name is Daffy Duck.";

        [Benchmark]
        public string StringSubstring() => SampleString.Substring(1);

        [Benchmark]
        public string StringRemove() => SampleString.Remove(0, 1);

        public void AssertTestIsValid()
        {
            string subsRes = StringSubstring();
            string remvRes = StringRemove();

            if (subsRes == null
                || subsRes.Length != SampleString.Length - 1
                || subsRes != remvRes) {
                throw new Exception("INVALID TEST!");
            }
        }
    }

    class Program
    {
        static void Main()
        {
            // let's make sure test results are really equal / valid
            new StringSubstringVsRemove().AssertTestIsValid();

            var summary = BenchmarkRunner.Run<StringSubstringVsRemove>();
        }
    }
}

ফলাফল:

BenchmarkDotNet=v0.11.4, OS=Windows 10.0.17763.253 (1809/October2018Update/Redstone5)
Intel Core i7-6700HQ CPU 2.60GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.0.100-preview-010184
  [Host]     : .NET Core 3.0.0-preview-27324-5 (CoreCLR 4.6.27322.0, CoreFX 4.7.19.7311), 64bit RyuJIT
  DefaultJob : .NET Core 3.0.0-preview-27324-5 (CoreCLR 4.6.27322.0, CoreFX 4.7.19.7311), 64bit RyuJIT

|          Method |     Mean |     Error |    StdDev |
|---------------- |---------:|----------:|----------:|
| StringSubstring | 19.37 ns | 0.3940 ns | 0.3493 ns |
|    StringRemove | 22.52 ns | 0.4062 ns | 0.3601 ns |

9

আমি অনুমান করেছিলাম Removeএবং Substringপ্রথম স্থানটি বেঁধে দেব , যেহেতু তারা উভয়ই স্ট্রিংয়ের একটি নির্দিষ্ট আকারের অংশ স্লাপ TrimStartকরে , যেখানে প্রতিটি চরিত্রের একটি পরীক্ষা দিয়ে বাম দিক থেকে স্ক্যান করে এবং ঠিক একই কাজটি সম্পাদন করতে হবে অন্যান্য দুটি পদ্ধতি। গুরুতরভাবে, যদিও এটি চুল বিভক্ত হয়।


1
আসলে, Substringতুলনায় দ্রুত Remove, কারণ Removeকল Substring
জারোস্লাভ জান্দেক

@ জারোস্লাভ: এটি সত্য নয়। উভয় Substringএবং Removeএকটি ব্যক্তিগত পদ্ধতি উপর নির্ভর করে FillSubstring,।
মার্সেলো ক্যান্টোস

এটি যাচাই করা হয়নি, তবে এটি খুব প্রশংসনীয় মনে হচ্ছে:string Remove(this string source, int from, int to) { return source.SubString(0, from) + source.SubString(to); }
ডাইকাম

1
@ জারোস্লাভ: আমি মোটামুটি প্রচলিত উইন্ডোজ দেব পরিবেশে mscorlib.dll এ দুটি পদ্ধতির অপসারণকে দেখছি। তারা উভয় System.PInvoke.EE.AllocateStringগন্তব্য স্ট্রিং অবজেক্ট বরাদ্দ কল এবং তারপরে FillSubstringঅক্ষর অনুলিপি কল । আমি কি ভুল জিনিসটির দিকে তাকিয়ে আছি?
মার্সেলো ক্যান্টোস

1
@ মার্সেলো: যাইহোক, আপনার প্রথম মন্তব্যটি মূলত সম্পূর্ণ আলাদা জিনিস বলেছে। আমার সম্ভবত আরও ভাল শব্দ ব্যবহার করা উচিত ছিল, বিন্দুটি ( Substring> Remove) হলেও কার্যকর । আমি আরও মন্তব্য করতে যাচ্ছি না কারণ আলোচনাটি আমার যথেষ্ট সময় নিয়েছিল।
জারোস্লাভ জান্দেক

6

আপনি যদি সত্যিই যত্নবান হন তবে আপনি এটির প্রোফাইল দিতে পারেন। অনেকগুলি পুনরাবৃত্তির একটি লুপ লিখুন এবং দেখুন কী ঘটে। তবে সম্ভাবনাগুলি হ'ল এটি আপনার অ্যাপ্লিকেশনটির কোনও বাধা নয় এবং ট্রিমস্টার্টটি সবচেয়ে শব্দার্থিকভাবে সঠিক বলে মনে হচ্ছে। অনুকূলিতকরণের আগে কোডটি সহজেই লেখার চেষ্টা করুন।


6
TrimStartযেহেতু, অন্তত সঠিক "//temp string".TrimStart('/')হবে না শুধুমাত্র প্রথম অপসারণ '/'
মার্সেলো ক্যান্টোস

ফাংশনটির তখন নামকরণ করা হয়নি। আমি সি # লোক নই।
স্টিফান কেন্ডাল

@ স্টেফানকেনডাল: ট্যাগগুলি দেখুন
বিজয় সিং রানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.