স্ট্রিংগুলি সংঘবদ্ধ করার সবচেয়ে কার্যকরী উপায়?


285

স্ট্রিংগুলি সংঘবদ্ধ করার সবচেয়ে কার্যকরী উপায় কী?


9
আমি এখানে একটি বিশিষ্ট সতর্কতা রাখতে চাই যে গৃহীত উত্তরটি উল্লেখযোগ্যভাবে অসম্পূর্ণ কারণ এটি সমস্ত প্রাসঙ্গিক ক্ষেত্রে আলোচনা করে না।
usr ডিরেক্টরির

@ ইউএসআর প্রকৃতপক্ষে ... StringBuilderব্যবহারের ক্ষেত্রে আরও বিস্তারিত তথ্য এখানে পাওয়া যাবে
তামিরভেদ

সি # 6 এর মতো আমার নতুন পছন্দটি হ'ল এখানে নিয়মিত পাঠ্য {foo {এবং {বার} "... এটি String.Formatস্টেরয়েডের মতো । যা পারফরম্যান্স বুদ্ধিমান, একের তুলনায় +এবং String.Concatতার চেয়ে অনেক কম ধীরে ধীরে StringBuilder, তবে একাধিক কল করার চেয়ে ধীর হলেও, এর চেয়ে অনেক ভাল । কার্যত বললে, পারফরম্যান্সের পার্থক্যগুলি এমন যে, যদি আমি একত্রীকরণের জন্য কেবল একটি উপায় বেছে নিতে পারি, তবে আমি স্ট্রিং ইন্টারপোলেশনগুলি ব্যবহার করে বেছে নেব $... যদি দুটি উপায় থাকে তবে StringBuilderআমার টুলবক্সে যুক্ত করুন। এই দুটি উপায় আপনি সেট করেছেন।
u8it

String.Joinনিচে উত্তর কী কাজ করে না +ন্যায়বিচার এবং হয় কার্যকরীভাবে ভাষী, CONCATENATE স্ট্রিং করার জন্য একটি খারাপ ভাবে, কিন্তু এটা জ্ঞানী আশ্চর্যজনক ফাস্ট কার্যকারিতা। উত্তর আকর্ষণীয় কেন। String.Concatএবং String.Joinউভয়ই অ্যারেতে অভিনয় করতে পারে তবে String.Joinএটি আসলে দ্রুত। স্পষ্টতই, এর String.Joinচেয়ে বেশ পরিশীলিত এবং আরও বেশি অনুকূলিত হয়েছে String.Concat, আংশিক কারণ এটি এর আগে একইভাবে কাজ করে StringBuilderযে এটি প্রথমে স্ট্রিংয়ের দৈর্ঘ্য গণনা করে এবং তারপরে UnSafeCharBuffer ব্যবহার করে এই জ্ঞানটি থেকে স্ট্রিংটি তৈরি করে।
u8it

ঠিক আছে, সুতরাং এটি দ্রুত, তবে String.Joinএমন একটি অ্যারে তৈরি করা দরকার যা সম্পদটি অক্ষম বলে মনে হচ্ছে? ... এটি সক্রিয় হয় +এবং String.Concatযাইহোক তাদের উপাদানগুলির জন্য অ্যারেগুলি তৈরি করে। ফলস্বরূপ, ম্যানুয়ালি একটি অ্যারে তৈরি করা এবং এটিকে খাওয়ানো String.Joinতুলনামূলকভাবে দ্রুততর হয় ... তবে, StringBuilderএখনও String.Joinপ্রতিটি ব্যবহারিক উপায়ে দক্ষতার বাইরে চলে যায় যখন $লম্বা স্ট্রিংগুলিতে কিছুটা ধীর এবং দ্রুততর হয় ... এটি ব্যবহার করার জন্য এটি বিশ্রী এবং কুশ্রী বলে উল্লেখ করার String.Joinদরকার নেই ঘটনাস্থলে এটির জন্য একটি অ্যারে তৈরি করা।
u8it

উত্তর:


154

StringBuilder.Append()পদ্ধতি অনেক ব্যবহার বেশী ভালো +অপারেটর। তবে আমি খুঁজে পেয়েছি যে, 1000 বা তারও কম সময় নির্ধারণের সময়, এর String.Join()চেয়ে আরও কার্যকর StringBuilder

StringBuilder sb = new StringBuilder();
sb.Append(someString);

একমাত্র সমস্যাটি String.Joinহ'ল আপনাকে একটি সাধারণ ডিলিমিটার দিয়ে স্ট্রিংগুলি সংহত করতে হবে।

সম্পাদনা: @ অ্যারানভারসো যেমন উল্লেখ করেছেন, আপনি ডিলিমিটার তৈরি করতে পারেন string.Empty

string key = String.Join("_", new String[] 
{ "Customers_Contacts", customerID, database, SessionID });

11
StringBuilderএকটি বিশাল তুলনীয় প্রারম্ভিকরণ ব্যয় রয়েছে, এটি কেবল তখনই কার্যকর যখন খুব বড় স্ট্রিং, বা খুব বেশি কনটেন্টেশন ব্যবহার করা হয়। কোনও প্রদত্ত পরিস্থিতির সন্ধান করা তুচ্ছ নয়। পারফরম্যান্স যদি সমস্যা হয় তবে প্রোফাইলিংটি আপনার বন্ধু (এএনটিএস পরীক্ষা করুন)।
আবেল

32
এটি একক লাইন সংমিশ্রনের জন্য সত্য নয়। বলুন যে আপনি মাই স্ট্রিং = "ফু" + ভের ১ + "বার" + ভার ২ + "হ্যালো" + ভের ৩ + "ওয়ার্ল্ড" করেন, সংকলকটি স্বয়ংক্রিয়ভাবে এটিকে স্ট্রিংকনক্যাট কলে রূপান্তরিত করে, এটি যতটা দক্ষ হয় তেমন কার্যকর। এই উত্তরটি ভুল, সবচেয়ে ভালো উত্তর প্রচুর থেকে পছন্দ করে নিন আছে
csauve

2
তুচ্ছ স্ট্রিং কনকেন্টেশন করার জন্য যা সবচেয়ে বেশি পাঠযোগ্য। স্ট্রিং a = b + c + d; স্ট্রিংবিল্ডারের সাথে এটি করার চেয়ে প্রায় সবসময় দ্রুত হবে তবে পার্থক্যটি সাধারণত অপ্রাসঙ্গিক। একই স্ট্রিংটিতে বারবার যুক্ত করার সময় (উদাহরণস্বরূপ প্রতিবেদন তৈরি করা) বা বড় স্ট্রিংয়ের সাথে ডিল করার সময় স্ট্রিংবিল্ডার (বা আপনার পছন্দসই অন্যান্য বিকল্প) ব্যবহার করুন।
সোয়ানি

5
কেন আপনি উল্লেখ করেন নি string.Concat?
ভেনেমো

271

। নেট পারফরম্যান্স গুরু, রিকো মারিয়ানির এই একই বিষয়ে একটি নিবন্ধ ছিল । এটি সন্দেহজনক হিসাবে এত সহজ নয়। প্রাথমিক পরামর্শটি হ'ল:

যদি আপনার প্যাটার্নটি এমন দেখাচ্ছে:

x = f1(...) + f2(...) + f3(...) + f4(...)

এটি একটি কনক্যাট এবং এটি জিপি, স্ট্রিংবিল্ডার সম্ভবত সাহায্য করবে না।

যদি আপনার প্যাটার্নটি এমন দেখাচ্ছে:

if (...) x += f1(...)
if (...) x += f2(...)
if (...) x += f3(...)
if (...) x += f4(...)

তারপরে আপনি সম্ভবত স্ট্রিংবিল্ডার চান।

তবুও এই দাবির সমর্থনের জন্য আর একটি নিবন্ধ এসেছে এরিক লিপার্টের যেখানে তিনি এক লাইনে +কনটেন্টেশনগুলিতে বিশদ পদ্ধতিতে সঞ্চালিত অপ্টিমাইজেশনের বর্ণনা দিয়েছেন ।


1
স্ট্রিং.ফর্ম্যাট () সম্পর্কে কী?
আয়রনস্লাগ

85

স্ট্রিং কনটেক্সেশনগুলির 6 প্রকার রয়েছে:

  1. প্লাস ( +) চিহ্ন ব্যবহার করে ।
  2. ব্যবহার string.Concat()
  3. ব্যবহার string.Join()
  4. ব্যবহার string.Format()
  5. ব্যবহার string.Append()
  6. ব্যবহার StringBuilder

একটি পরীক্ষায় এটি প্রমাণিত হয়েছে যে string.Concat()শব্দগুলি 1000 এর চেয়ে কম (প্রায়) কম হয় এবং শব্দগুলি 1000 এর বেশি হলে StringBuilderব্যবহার করা উচিত approach

আরও তথ্যের জন্য, এই সাইটটি দেখুন

স্ট্রিং.জয়েন () বনাম স্ট্রিং.কনক্যাট ()

এখানে স্ট্রিং.কনকাট পদ্ধতিটি স্ট্রিংয়ের সমতুল্য an একটি ফাঁকা বিভাজক সহ জোনের পদ্ধতিতে প্রার্থনা। খালি স্ট্রিং যুক্ত করা দ্রুত, তবে এটি না করা আরও দ্রুত, সুতরাং স্ট্রিং on কনক্যাট পদ্ধতিটি এখানে সর্বোত্তম।


4
এটি পড়তে হবে এটি স্ট্রিং প্রমাণিত হয়েছে on কনক্যাট () বা + সেরা উপায়। হ্যাঁ আমি নিবন্ধটি থেকে এটি পেতে পারি তবে এটি আমার একটি ক্লিক বাঁচায়। সুতরাং, + এবং কনটাক্ট একই কোডে সংকলন করুন।
brumScouse

আমি এই ভিত্তিটি আমার আরও কার্যকর করার একটি পদ্ধতি তৈরি করার জন্য ব্যবহার করেছি, যেখানে আমাকে কেবল 3 টি স্ট্রিং সংশ্লেষ করার প্রয়োজন ছিল। আমি দেখতে পেলাম যে +তুলনায় আসলে 3 মিলিসেকেন্ড দ্রুত ছিল string.Concat(), যদিও আমি string.Concat()আউট্রেসের আগে প্রয়োজনীয় স্ট্রিংগুলির পরিমাণ খতিয়ে দেখিনি +
জেনমলক

59

চিনহ ডো থেকে - স্ট্রিংবিল্ডার সর্বদা দ্রুত হয় না :

চলতি নিয়ম

  • যখন concatenating তিন গতিশীল স্ট্রিং মান বা কম, ঐতিহ্যগত স্ট্রিং সংযুক্তকরণের ব্যবহার করুন।

  • তিনটিরও বেশি গতিশীল স্ট্রিংয়ের মানগুলি যুক্ত করার সময় ব্যবহার করুন StringBuilder

  • বেশ কয়েকটি @স্ট্রিং আক্ষরিক থেকে একটি বড় স্ট্রিং তৈরি করার সময়, স্ট্রিং আক্ষরিক বা ইনলাইন + অপারেটরটি ব্যবহার করুন।

বেশিরভাগ সময়ই StringBuilderআপনার সেরা বাজি, তবে সেই পোস্টে এমন কিছু কেস দেখা গেছে যা আপনার প্রতিটি পরিস্থিতির সম্পর্কে কমপক্ষে চিন্তা করা উচিত।


8
আফাইক @ কেবলমাত্র পালানোর সিকোয়েন্সগুলি প্রক্রিয়াকরণ বন্ধ করে দেয়। msdn.microsoft.com/en-us/library/362314fe.aspx একমত
abatishchev

12

আপনি যদি লুপটিতে পরিচালনা করছেন StringBuilderতবে সম্ভবত এটি যাওয়ার উপায়; এটি আপনাকে নিয়মিত নতুন স্ট্রিং তৈরির ওভারহেড সংরক্ষণ করে। কোডে যা কেবল একবারই চলবে, String.Concatসম্ভবত তা ঠিক আছে।

যাইহোক, রিকো মারিয়ানি (। নেট অপ্টিমাইজেশন গুরু) একটি কুইজ তৈরি করেছিলেন যাতে তিনি শেষে বলেছিলেন যে বেশিরভাগ ক্ষেত্রেই তিনি সুপারিশ করেন String.Format


আমি কয়েক বছর ধরে স্ট্রিং + স্ট্রিং ওভার স্ট্রিং ও স্ট্রিং ওভার স্ট্রিং + এর ব্যবহারের সাথে পরামর্শ করেছি I've আমি মনে করি পঠনযোগ্যতা সুবিধাগুলি পারফরম্যান্স সুবিধার বাইরেও একটি অতিরিক্ত সুবিধা।
স্কট লরেন্স

1
এটি আসল সঠিক উত্তর। স্ট্রিংবিল্ডারের পক্ষে বর্তমানে গৃহীত উত্তরটি ভুল, কারণ এটিতে একক লাইন সংযোজনের কথা উল্লেখ করা হয়নি যার জন্য স্ট্রিংকনক্যাট বা + আরও দ্রুত। সামান্য পরিচিত তথ্য হ'ল সংকলকটি আসলে স্ট্রিংকনক্যাটগুলিতে 'এর অনুবাদ করে। এছাড়াও, loops জন্য বা একাধিক লাইন concats আমি একটি কাস্টম নির্মিত স্ট্রিং রচয়িতা ব্যবহারের জন্য শুধুমাত্র appends যে যখন .ToString বলা হয় - অনির্দিষ্ট বাফার সমস্যা StringBuilder আছে অভিভূতকারী
csauve

2
স্ট্রিং.ফর্ম্যাট কোনও পরিস্থিতিতে সবচেয়ে দ্রুততম উপায় নয়। আমি জানি না যে কেসটি সামনে আসে সেদিকে কীভাবে সহায়তা করা যায়।
usr ডিরেক্টরির

@ অর - দ্রষ্টব্য যে রিকো স্পষ্টভাবে এটি দ্রুততম বলছে না , কেবল এটিই তার প্রস্তাব: "যদিও এটি সবচেয়ে খারাপ সম্পাদন করছে, এবং আমরা এটি আগেই জানতাম, আপনার সিএলআর পারফরম্যান্স আর্কিটেক্ট উভয়ই একমত যে [স্ট্রিং.ফর্ম্যাট] উচিত ডিফল্ট পছন্দ হোন। অত্যন্ত অসম্ভব ইভেন্টে এটি একেবারে সমস্যা হয়ে উঠলে সমস্যাটি কেবলমাত্র সাধারণ পরিমিত পরিবর্তনগুলির সাথে সহজেই সম্বোধনযোগ্য।
আদম ভি

@ অ্যাডামভি প্রশ্নটি দ্রুততম উপায় সম্পর্কে। আমি এটিকে ডিফল্ট পছন্দ বলে অসন্তুষ্ট করছি যদিও নিখুঁত কারণে নয়। এটি আনাড়ি সিনট্যাক্স হতে পারে। পুনঃভাগটি ইচ্ছামত পিছনে পিছনে রূপান্তর করতে পারে।
usr

10

আমার বৃহত আকারের এনএলপি অ্যাপ্লিকেশানের জন্য আমি এক দশকেরও বেশি সময় ধরে এখানে সবচেয়ে দ্রুতগতির পদ্ধতিটি প্রস্তুত করেছি। আমার IEnumerable<T>বিভিন্ন প্রকারের ( Charএবং String) বিভাজক এবং ছাড়াই অন্য ইনপুট ধরণের জন্য এবং তারপরে ভিন্নতা রয়েছে , তবে এখানে আমি কোনও অ্যারেতে সমস্ত স্ট্রিংকে একক স্ট্রিংয়ে সংবিধানের সরল কেসটি দেখাই , কোনও বিভাজক ছাড়াই। এখানে সর্বশেষ সংস্করণটি সি # 7 এবং .NET 4.7 এ বিকাশিত এবং ইউনিট-পরীক্ষিত ।

উচ্চতর পারফরম্যান্সের দুটি কী রয়েছে; প্রথমটি হ'ল প্রয়োজনীয় মোট আকারের প্রাক-গণনা করা। এখানে প্রদর্শিত হিসাবে ইনপুট একটি অ্যারে হয় যখন এই পদক্ষেপ তুচ্ছ। IEnumerable<T>পরিবর্তে পরিচালনার জন্য , প্রথমে মোটটি গণনার জন্য স্ট্রিংগুলি একটি অস্থায়ী অ্যারে হিসাবে জড়ো করা মূল্যহীন (অ্যারে ToString()প্রযুক্তিগতভাবে একাধিক বার কল করা এড়াতে হবে , পার্শ্ব-প্রতিক্রিয়া হওয়ার সম্ভাবনা দেখিয়ে, এটি করা প্রত্যাশিত শব্দার্থকে পরিবর্তন করতে পারে একটি 'স্ট্রিং জয়েন' অপারেশন)।

এরপরে, চূড়ান্ত স্ট্রিংয়ের মোট বরাদ্দের আকার দেওয়া হলে, ফলাফলের স্ট্রিংটি ইন-প্লেস তৈরি করে পারফরম্যান্সে সর্বাধিক উত্সাহ অর্জন করা হয় । এটি করার জন্য অস্থায়ীভাবে কোনও নতুনের অপরিবর্তনীয়তা স্থগিত করার (সম্ভবত বিতর্কিত) কৌশল প্রয়োজন Stringযা প্রাথমিকভাবে জিরো পূর্ণ বরাদ্দ করা হয়। এ জাতীয় কোনও বিতর্ক থাকলেও ...

... নোট করুন যে এই পৃষ্ঠায় এটিই কেবলমাত্র বাল্ক-কনটেন্টেশন সমাধান যা সম্পূর্ণরূপে নির্মাণকারীর দ্বারা অতিরিক্ত বরাদ্দ এবং অনুলিপি এড়ানো যায় avoString

সম্পূর্ণ কোড:

/// <summary>
/// Concatenate the strings in 'rg', none of which may be null, into a single String.
/// </summary>
public static unsafe String StringJoin(this String[] rg)
{
    int i;
    if (rg == null || (i = rg.Length) == 0)
        return String.Empty;

    if (i == 1)
        return rg[0];

    String s, t;
    int cch = 0;
    do
        cch += rg[--i].Length;
    while (i > 0);
    if (cch == 0)
        return String.Empty;

    i = rg.Length;
    fixed (Char* _p = (s = new String(default(Char), cch)))
    {
        Char* pDst = _p + cch;
        do
            if ((t = rg[--i]).Length > 0)
                fixed (Char* pSrc = t)
                    memcpy(pDst -= t.Length, pSrc, (UIntPtr)(t.Length << 1));
        while (pDst > _p);
    }
    return s;
}

[DllImport("MSVCR120_CLR0400", CallingConvention = CallingConvention.Cdecl)]
static extern unsafe void* memcpy(void* dest, void* src, UIntPtr cb);

আমার উল্লেখ করা উচিত যে আমি নিজের ব্যবহার থেকে এই কোডটিতে সামান্য পরিবর্তন রয়েছে slight আসলটিতে, আমি আসল অনুলিপি করতে C # থেকে cpblk IL নির্দেশকে কল করি । কোডটিতে সরলতা এবং বহনযোগ্যতার জন্য, আমি পি / ইনভোকের পরিবর্তে এটিকে প্রতিস্থাপন করেছি , যেমন আপনি দেখতে পাচ্ছেন। X64 ( তবে x86 নয় ) এর সর্বোচ্চ পারফরম্যান্সের জন্য আপনি এর পরিবর্তে সিপিবিএলকে পদ্ধতিটি ব্যবহার করতে চাইতে পারেন ।memcpy


string.Joinইতিমধ্যে আপনার জন্য এই সমস্ত কাজ করে। এটি নিজের লেখার দরকার নেই। এটি চূড়ান্ত স্ট্রিংয়ের আকারের গণনা করে, সেই আকারের একটি স্ট্রিং তৈরি করে এবং তারপরে অন্তর্নিহিত অক্ষর অ্যারেতে লিখে দেয়। এমনকি এটি প্রক্রিয়াটিতে পাঠযোগ্য পরিবর্তনশীল নামগুলি ব্যবহারের বোনাস রয়েছে।
পরিবেশন করুন

1
@ সার্ভি মন্তব্যটির জন্য ধন্যবাদ; প্রকৃতপক্ষে String.Joinদক্ষ হতে পারে। যেমনটি আমি ইন্ট্রোতে ইঙ্গিত দিয়েছি, এখানে কোডটি এমন ফাংশনগুলির একটি পরিবারের সহজ চিত্র যা আমি দৃশ্যের জন্য ব্যবহার করি যা String.Joinহ্যান্ডেল করে না (যেমন বিচ্ছেদের জন্য Charঅনুকূলকরণ করা) বা নেট নেট এর আগের সংস্করণগুলিতে হ্যান্ডেল করে না। আমি মনে করি সহজ উদাহরণটির জন্য আমার এটি নেওয়া উচিত ছিল না, যেহেতু এটি String.Joinশূন্য বিভাজক প্রক্রিয়াজাতকরণের "অদক্ষতা," সম্ভবত অপ্রয়োজনীয়, যদিও ইতিমধ্যে ভালভাবে পরিচালনা করে। String.Empty
গ্লেন স্লেডেন

অবশ্যই, আপনার বিভাজনকারী না থাকার ক্ষেত্রে অবশ্যই আপনার কল করা উচিত Concat, যা এটি সঠিকভাবে করে। যেভাবেই আপনার নিজের কোডটি লেখার দরকার নেই।
পরিবেশন করুন

7
@ সার্ভে আমি এই পরীক্ষার জোতাString.Join ব্যবহার করে আমার কোড বনামের পারফরম্যান্সের তুলনা করেছি । 10 মিলিয়ন 100 শব্দ আকারের স্ট্রিং প্রতিটি পর্যন্ত র্যান্ডম সংযুক্তকরণের অপারেশন জন্য, উপরে দেখানো কোড ধারাবাহিকভাবে 34% চেয়ে দ্রুত উপর x64 সঙ্গে মুক্তি বিল্ড .NET 4.7 । যেহেতু ওপি স্পষ্টভাবে "সবচেয়ে দক্ষ" পদ্ধতির জন্য অনুরোধ করেছে, ফলাফলটি প্রস্তাব দেয় যে আমার উত্তর প্রযোজ্য। এটি যদি আপনার উদ্বেগের সমাধান করে তবে আমি আপনাকে আপনার ডাউনটাতে পুনর্বিবেচনা করার জন্য আমন্ত্রণ জানাচ্ছি। String.Join
গ্লেন স্লেডেন

1
আমি সম্প্রতি x64 পূর্ণ CLR 4.7.1 এই benchmarked এবং এটি হিসাবে দ্রুত প্রায় দ্বিগুন string.Join যেমন 25 সম্পর্কে% কম মেমরি বরাদ্দ (সাথে থাকতে এটি i.imgur.com/SxIpEmL.png ) যখন cpblk বা ব্যবহার github.com/ JonHanna / Mnemosyne
Quentin-starin

6

এই এমএসডিএন নিবন্ধ থেকে :

সময় এবং স্মৃতি উভয় ক্ষেত্রেই স্ট্রিংবিল্ডার অবজেক্ট তৈরির সাথে কিছু ওভারহেড যুক্ত। দ্রুত মেমরিযুক্ত একটি মেশিনে, যদি আপনি প্রায় পাঁচটি অপারেশন করেন তবে একটি স্ট্রিংবিল্ডার সার্থক হয়। থাম্বের নিয়ম হিসাবে, আমি বলব যে 10 বা ততোধিক স্ট্রিং অপারেশনগুলি যে কোনও মেশিনের ওভারহেডের পক্ষে যুক্তিযুক্ত প্রমাণ এমনকি ধীর।

সুতরাং আপনার যদি বিশ্বাস হয় যে এমএসডিএন যদি স্ট্রিংবিল্ডারের সাথে যান তবে আপনাকে যদি 10 টিরও বেশি স্ট্রিং অপারেশন / কনটেনটেশন করতে হয় - অন্যথায় '+' সহ স্ট্রিং কনক্যাটটি ভাল।


5

এটি উল্লেখ করাও গুরুত্বপূর্ণ যে আপনি স্ট্রিং লিটারেলগুলি সংক্ষিপ্ত করে+ তুললে আপনার অপারেটরটি ব্যবহার করা উচিত ।

আপনি যখন + অপারেটর ব্যবহার করে স্ট্রিং লিটারালস বা স্ট্রিং ধ্রুবককে একত্রীকরণ করেন, সংকলকটি একটি একক স্ট্রিং তৈরি করে। কোনও রান টাইম কনটেনটেশন হয় না।

কীভাবে: একাধিক স্ট্রিং কনটেনেট (সি # প্রোগ্রামিং গাইড)


5

অন্যান্য উত্তরগুলি যুক্ত করে, দয়া করে মনে রাখবেন যে স্ট্রিংবিল্ডারকে বরাদ্দ দেওয়ার জন্য প্রাথমিক পরিমাণের মেমরির কথা বলা যেতে পারে

ধারণক্ষমতা প্যারামিটার অক্ষর আছে যা মেমরির বর্তমান উদাহরণস্বরূপ দ্বারা বরাদ্দ সংরক্ষণ করা যাবে সর্বোচ্চ সংখ্যক সংজ্ঞায়িত করে। এর মান ক্যাপাসিটি সম্পত্তিতে বরাদ্দ করা হয়েছে । যদি বর্তমান পরিস্থিতিতে সংরক্ষণের জন্য অক্ষরের সংখ্যা এই ক্ষমতা মানটি ছাড়িয়ে যায় তবে স্ট্রিংবিল্ডার বস্তু সেগুলি সঞ্চয় করতে অতিরিক্ত মেমরি বরাদ্দ করে।

যদি ক্ষমতাটি শূন্য হয় তবে বাস্তবায়ন-নির্দিষ্ট ডিফল্ট ক্ষমতা ব্যবহৃত হয়।

বারবার বারবার স্ট্রিংবিল্ডারের সাথে সংযোজন করা যা প্রাক বরাদ্দ করা হয়নি তা নিয়মিত স্ট্রিংগুলিকে বারবার সংলগ্ন করার মতো প্রচুর অযৌক্তিক বরাদ্দ পেতে পারে।

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

আপনি যদি আকার সম্পর্কে কোনও ধরণের অনুমান করতে না পারেন তবে আপনি সম্ভবত একটি ইউটিলিটি ফাংশন লিখছেন যা প্রাক বরাদ্দ নিয়ন্ত্রণের জন্য নিজস্ব optionচ্ছিক যুক্তি থাকতে হবে।


4

নিম্নলিখিত একাধিক স্ট্রিং সংহত করার জন্য আরও একটি বিকল্প সমাধান হতে পারে।

String str1 = "sometext";
string str2 = "some other text";

string afterConcate = $"{str1}{str2}";

স্ট্রিং বিরতি


1
এটি সাধারণভাবে কনটেন্টেশন করার সাধারণ পদ্ধতি হিসাবে আশ্চর্যজনক nice এটি মূলত String.Formatতবে আরও পাঠযোগ্য এবং এর সাথে কাজ করা সহজ। বেঞ্চ-উপলক্ষে এটা চেয়ে কিছুটা মন্থর এর +এবং String.Concatএক লাইন concatenations এ কিন্তু অনেক যারা উভয় বেশী ভালো পুনরাবৃত্তিমূলক উপার্জন কল এ StringBuilderকম প্রয়োজনীয়।
u8it

2

সবচেয়ে কার্যকর হ'ল স্ট্রিংবিল্ডার ব্যবহার করা যেমন:

StringBuilder sb = new StringBuilder();
sb.Append("string1");
sb.Append("string2");
...etc...
String strResult = sb.ToString();

@ জোনজি: স্ট্রিং.কনক্যাট আপনার কাছে কয়েকটি ছোট ছোট জিনিস থাকলে ভাল। তবে আপনি যদি মেগাবাইটের ডেটা বোঝাতে চান তবে আপনার প্রোগ্রামটি সম্ভবত সম্ভাব্য।


আরে ডেটা মেগাবাইটের সমাধান কী?
নীল

2

এই 2 টুকরা কোড ব্যবহার করে দেখুন এবং সমাধানটি পাবেন।

 static void Main(string[] args)
    {
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < 10000000; i++)
        {
            s.Append( i.ToString());
        }
        Console.Write("End");
        Console.Read();
    }

বনাম

static void Main(string[] args)
    {
        string s = "";
        for (int i = 0; i < 10000000; i++)
        {
            s += i.ToString();
        }
        Console.Write("End");
        Console.Read();
    }

আপনি দেখতে পাবেন যে 1 ম কোডটি সত্যিই দ্রুত শেষ হবে এবং মেমরিটি ভাল পরিমাণে থাকবে।

দ্বিতীয় কোডটি সম্ভবত মেমরিটি ঠিক থাকবে, তবে এটি আরও বেশি সময় নিবে ... সুতরাং আপনার যদি প্রচুর ব্যবহারকারীর জন্য একটি অ্যাপ্লিকেশন থাকে এবং আপনার গতির প্রয়োজন হয় তবে 1 ম ব্যবহার করুন। আপনার যদি স্বল্প মেয়াদে এক ব্যবহারকারী অ্যাপ্লিকেশনটির জন্য অ্যাপ থাকে তবে সম্ভবত আপনি উভয়ই ব্যবহার করতে পারবেন বা ২ য় বিকাশকারীদের জন্য আরও "প্রাকৃতিক" হবে।

চিয়ার্স।


1

মাত্র দুটি স্ট্রিংয়ের জন্য, আপনি অবশ্যই স্ট্রিংবিল্ডার ব্যবহার করতে চান না। উপরে কিছু থ্রেশহোল্ড রয়েছে যার উপরে স্ট্রিংবিল্ডার ওভারহেড একাধিক স্ট্রিং বরাদ্দের ওভারহেডের চেয়ে কম।

সুতরাং, আরও আরও 2-3 টি স্ট্রিংয়ের জন্য ড্যানিস্মার্ফ কোডটি ব্যবহার করুন । অন্যথায়, কেবল + অপারেটর ব্যবহার করুন।


1

সিস্টেম। স্ট্রিং অপরিবর্তনীয়। যখন আমরা একটি স্ট্রিং ভেরিয়েবলের মান পরিবর্তন করি তখন একটি নতুন মেমরি নতুন মান এবং পূর্ববর্তী মেমরির বরাদ্দ প্রকাশিত হয়। System.StringBuilder একটি পরিবর্তনীয় স্ট্রিংয়ের ধারণা তৈরি করার জন্য ডিজাইন করা হয়েছিল যেখানে পরিবর্তিত স্ট্রিংয়ের জন্য পৃথক মেমরি অবস্থান বরাদ্দ না করে বিভিন্ন ক্রিয়াকলাপ সম্পাদন করা যেতে পারে।


1

আরেকটি সমাধান:

লুপের ভিতরে স্ট্রিংয়ের পরিবর্তে তালিকা ব্যবহার করুন।

List<string> lst= new List<string>();

for(int i=0; i<100000; i++){
    ...........
    lst.Add(...);
}
return String.Join("", lst.ToArray());;

এটা খুব দ্রুত।


1

এটি সত্যই আপনার ব্যবহারের ধরণের উপর নির্ভর করে। স্ট্রিং.জাইন, স্ট্রিং, কনক্যাট এবং স্ট্রিংয়ের মধ্যে একটি বিশদ মাপদণ্ড এখানে পাওয়া যাবে: স্ট্রিং.ফর্ম্যাট নিবিড় লগিংয়ের জন্য উপযুক্ত নয়

(আমি আসলে এই প্রশ্নের উত্তরটি দিয়েছিলাম )


0

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

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