স্ট্রিং বনাম স্ট্রিংবিল্ডার


215

আমি মধ্যে পার্থক্য বুঝতে Stringএবং StringBuilder( StringBuilderচপল হচ্ছে) কিন্তু দুই মধ্যে একটি বৃহৎ কর্মক্ষমতা পার্থক্য কি?

আমি যে প্রোগ্রামটিতে কাজ করছি তাতে প্রচুর কেস চালিত স্ট্রিং সংযোজন (500+) থাকে। StringBuilderএকটি ভাল পছন্দ ব্যবহার করছেন ?

উত্তর:


236

হ্যাঁ, পারফরম্যান্সের পার্থক্যটি উল্লেখযোগ্য। কেবি নিবন্ধটি দেখুন " ভিজ্যুয়াল সি # তে স্ট্রিং কনটেন্টেশন পারফরম্যান্স কীভাবে উন্নত করা যায় "।

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

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


44
থাম্বের একটি ভাল নিয়ম হ'ল স্ট্রিংস ব্যবহার করা যখন আপনি এটি পরিবর্তন করতে যাচ্ছেন না এবং আপনি যদি এটি পরিবর্তন করছেন তবে স্ট্রিংবিল্ডার ব্যবহার করুন।
টিম

31
আমি এই উত্তরটি অনেক পছন্দ করি, বিশেষত পারফরম্যান্সের আগে স্পষ্টতার জন্য কোডের পরামর্শ। বিকাশকারী হিসাবে, আমরা যতটা লিখি তেমন কোড পড়ার জন্য আমরা তত বেশি সময় ব্যয় করি।
স্কট লরেন্স 18

আউটলাও: আমি যদি মনে করি স্ট্যাক ওভারফ্লোটি সঠিকভাবে বুঝতে পারি তবে তার আলাদা উত্তর দেওয়া উচিত should
জে বাজুজি

2
আমার অভিজ্ঞতার ভিত্তিতে যদি আপনি 10-15 স্ট্রিংয়ের আশেপাশে একত্রিত করার চেষ্টা করেন তবে আপনি স্ট্রিং সহ যেতে পারেন তবে যদি না হয়। স্ট্রিংগুলির চেয়ে বেশি তারপরে স্ট্রিং বিল্ডার ব্যবহার করুন
পিয়িউশ

3
এটি এখনও কীভাবে এটি ব্যবহার করে তা নির্ভর করে, আসলে কোডিং হরর - মাইক্রো-অপটিমাইজেশন থিয়েটারের স্যাড ট্র্যাজেডি
এরিক ফিলিপস

56

4 টি স্ট্রিং সম্পর্কে গিলিয়ান কী বলেছিল তা স্পষ্ট করার জন্য, আপনার যদি এরকম কিছু থাকে:

string a,b,c,d;
 a = b + c + d;

তারপরে এটি স্ট্রিং এবং প্লাস অপারেটর ব্যবহার করে দ্রুত হবে। এটি কারণ (জাভা যেমন এরিক দেখায়), এটি অভ্যন্তরীণভাবে স্ট্রিংবিল্ডারকে স্বয়ংক্রিয়ভাবে ব্যবহার করে (প্রকৃতপক্ষে, এটি স্ট্রিংবিল্ডার ব্যবহার করে এমন একটি আদিম ব্যবহার করে)

তবে, আপনি যা করছেন তা যদি কাছাকাছি হয়:

string a,b,c,d;
 a = a + b;
 a = a + c;
 a = a + d;

তারপরে আপনাকে স্পষ্টভাবে একটি স্ট্রিংবিল্ডার ব্যবহার করতে হবে। । নেট এখানে স্বয়ংক্রিয়ভাবে একটি স্ট্রিং বিল্ডার তৈরি করে না, কারণ এটি অর্থহীন হবে। প্রতিটি লাইনের শেষে, "ক" একটি (অপরিবর্তনীয়) স্ট্রিং হতে হবে, সুতরাং এটি প্রতিটি লাইনে একটি স্ট্রিংবিল্ডার তৈরি এবং নিষ্পত্তি করতে হবে। গতির জন্য, আপনার বিল্ডিং শেষ না হওয়া পর্যন্ত আপনাকে একই স্ট্রিংবিল্ডার ব্যবহার করতে হবে:

string a,b,c,d;
StringBuilder e = new StringBuilder();
 e.Append(b);
 e.Append(c);
 e.Append(d);
 a = e.ToString();

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

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

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

29

আপনি যদি একাধিক লুপগুলি করেন বা আপনার কোড পাসে কাঁটাচামচ করে থাকেন ... তবে স্ট্রিংবিল্ডার পছন্দনীয় P তবে নিখুঁত পারফরম্যান্সের জন্য, যদি আপনি একটি একক স্ট্রিং ঘোষণার মাধ্যমে সরে যেতে পারেন , তবে এটি আরও বেশি পারফরম্যান্স।

উদাহরণ স্বরূপ:

string myString = "Some stuff" + var1 + " more stuff"
                  + var2 + " other stuff" .... etc... etc...;

তুলনায় আরও পারফরম্যান্ট

StringBuilder sb = new StringBuilder();
sb.Append("Some Stuff");
sb.Append(var1);
sb.Append(" more stuff");
sb.Append(var2);
sb.Append("other stuff");
// etc.. etc.. etc..

এই ক্ষেত্রে, স্ট্রিংবিল্ডকে আরও রক্ষণাবেক্ষণযোগ্য হিসাবে বিবেচনা করা যেতে পারে তবে এটি একক স্ট্রিং ঘোষণার চেয়ে বেশি পারফরম্যান্ট নয়।

10 এর মধ্যে 9 বার যদিও ... স্ট্রিং বিল্ডারটি ব্যবহার করুন।

পাশের নোটে: স্ট্রিং + ভার আরও পারফরম্যান্সযুক্ত যে স্ট্রিং.ফর্ম্যাট অ্যাপ্রোচ (সাধারণত) যা স্ট্রিংবিল্ডার অভ্যন্তরীণভাবে ব্যবহার করে (যখন সন্দেহ হয় ... প্রতিচ্ছবি পরীক্ষা করে দেখুন!)


17
আমি চাই আপনি কীভাবে জানতেন যে / কীভাবে তা যাচাই করতে হয়।
ক্রিসডাব্লু

2
আপনি প্রতিফলকটিতে পারফরম্যান্স যাচাই করেন না: আপনি সময় নির্ধারণের কোড দ্বারা কর্মক্ষমতা যাচাই করেন, কোনও প্রোফাইলারের সাথে বিশ্লেষণ করেন এবং প্রতিফলকের সাথে ব্যাখ্যা চান।
আলবিন সুন্নানবো

3
স্ট্রিং.ফর্ম্যাট () ব্যবহার করে বিবেচনা করুন ছোট সংখ্যক ছোট স্ট্রিং সংশ্লেষ করতে, বিশেষত লক্ষ্যটি হল ব্যবহারকারীকে বার্তা ফর্ম্যাট করা format
গ্যারি কিন্ডেল

1
এটি খুব খারাপ তথ্য। ("স্ট্রিং মাইস্ট্রিং আরও পারফরম্যান্ট") মোটেও সত্য নয়।
টম স্টিকেল

3
এই উত্তরের তথ্যটি ভুল। স্ট্রিংবিল্ডার একই স্টেটমেন্টে কনটেনটেশন করার চেয়ে কিছুটা দ্রুত; তবে আপনি যদি কয়েক হাজার বার ( উত্স ) এটি করেন তবে আপনি কেবলমাত্র উভয়ের মধ্যে একটি পার্থক্য লক্ষ্য করবেন । উত্স হিসাবে বলা হয়েছে, "এটি কিছু যায় আসে না!"
ডেভিড শেরেট

25

Stringবনাম বনাম ব্যবহার করার সময় গতির পার্থক্য প্রদর্শনের একটি সাধারণ উদাহরণ StringBuilder:

System.Diagnostics.Stopwatch time = new Stopwatch();
string test = string.Empty;
time.Start();
for (int i = 0; i < 100000; i++)
{
    test += i;
}
time.Stop();
System.Console.WriteLine("Using String concatenation: " + time.ElapsedMilliseconds + " milliseconds");

ফলাফল:

স্ট্রিং কনটেনটেশন ব্যবহার করে: 15423 মিলিসেকেন্ড

StringBuilder test1 = new StringBuilder();
time.Reset();
time.Start();
for (int i = 0; i < 100000; i++)
{
    test1.Append(i);
}
time.Stop();
System.Console.WriteLine("Using StringBuilder: " + time.ElapsedMilliseconds + " milliseconds");

ফলাফল:

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

ফলস্বরূপ, প্রথম পুনরাবৃত্তিটি 15423 এমএস নিয়েছে যখন দ্বিতীয় পুনরাবৃত্তিটি StringBuilder10 এমএস ব্যবহার করে নিয়েছে।

এটি আমার কাছে মনে হচ্ছে ব্যবহার StringBuilderকরা দ্রুত, অনেক দ্রুত।


24

এই বেঞ্চমার্কটি দেখায় যে 3 বা তার চেয়ে কম স্ট্রিংগুলির সংমিশ্রণ করার সময় নিয়মিত সংক্ষেপণ দ্রুত হয়।

http://www.chinhdo.com/20070224/stringbuilder-is-not-always-faster/

স্ট্রিংবিল্ডার মেমরির ব্যবহারে একটি বিশেষ উল্লেখযোগ্য উন্নতি করতে পারে, বিশেষত আপনার একসাথে 500 টি স্ট্রিং যুক্ত করার ক্ষেত্রে।

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

string buffer = "The numbers are: ";
for( int i = 0; i < 5; i++)
{
    buffer += i.ToString();
}
return buffer;

স্মৃতিতে কী হয়? নিম্নলিখিত স্ট্রিং তৈরি করা হয়:

1 - "The numbers are: "
2 - "0"
3 - "The numbers are: 0"
4 - "1"
5 - "The numbers are: 01"
6 - "2"
7 - "The numbers are: 012"
8 - "3"
9 - "The numbers are: 0123"
10 - "4"
11 - "The numbers are: 01234"
12 - "5"
13 - "The numbers are: 012345"

স্ট্রিংয়ের শেষে এই পাঁচটি সংখ্যা যুক্ত করে আমরা 13 স্ট্রিং অবজেক্ট তৈরি করেছি! এবং তাদের 12 টি অকেজো ছিল! কি দারুন!

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


2
গৌণ নিট: এটি বলা কিছুটা বিশ্রী যে "আমরা ১৩ টি স্ট্রিং অবজেক্ট তৈরি করেছি এবং সেগুলির মধ্যে 12 টি অকেজো ছিল", এবং তারপরে স্ট্রিংবিল্ডার এই সমস্যাটি সমাধান করে। সর্বোপরি, ছয়টি স্ট্রিং তৈরি করা ছাড়া আপনার কোনও বিকল্প নেই; তারা থেকে i.ToString()। সুতরাং স্ট্রিংবিল্ডারের সাহায্যে আপনাকে এখনও 6 + 1 স্ট্রিং তৈরি করতে হবে; এটি 13 টি স্ট্রিং তৈরি করে 7 টি স্ট্রিং তৈরি হ্রাস করেছে। তবে এটি এখনও দেখার জন্য এটি ভুল উপায়; ছয় নম্বর স্ট্রিং তৈরি প্রাসঙ্গিক নয়। নীচের লাইন: আপনার দ্বারা তৈরি করা ছয়টি স্ট্রিংয়ের কথা উল্লেখ করা উচিত নয় i.ToString(); তারা দক্ষতার তুলনা অংশ নয়।
টুলমেকারস্টেভ

12

হ্যাঁ, StringBuilderস্ট্রিংয়ের উপর বারবার অপারেশন করার সময় আরও ভাল পারফরম্যান্স দেয়। সমস্ত পরিবর্তনগুলি একক দৃষ্টান্তে করা হয়েছে কারণ এটি একটি নতুন উদাহরণ তৈরি করার পরিবর্তে অনেক সময় সাশ্রয় করতে পারে String

স্ট্রিং বনাম স্ট্রিংবিল্ডার

  • String

    1. Systemনেমস্পেসের অধীনে
    2. অপরিবর্তনীয় (কেবল পঠনযোগ্য) উদাহরণ
    3. যখন ক্রমাগত মান পরিবর্তন হয় তখন কর্মক্ষমতা হ্রাস পায়
    4. থ্রেড নিরাপদ
  • StringBuilder (পরিবর্তনীয় স্ট্রিং)

    1. System.Textনেমস্পেসের অধীনে
    2. পরিবর্তনীয় উদাহরণ
    3. বিদ্যমান পরিবর্তনগুলিতে নতুন পরিবর্তন করা হওয়ায় আরও ভাল পারফরম্যান্স দেখায়

দৃot়ভাবে ডটনেট মব নিবন্ধটি সুপারিশ করুন: সি # তে স্ট্রিং বনাম স্ট্রিংবিল্ডার

সম্পর্কিত স্ট্যাক ওভারফ্লো প্রশ্ন: স্ট্রিং যখন সি # তে পরিবর্তন হয় না তখন স্ট্রিংয়ের পরিবর্তনশীলতা?


12

স্ট্রিং বনাম স্ট্রিং বিল্ডার:

প্রথম জিনিসটি আপনাকে জানতে হবে যে এই দুটি শ্রেণিতে কোন অ্যাসেমব্লিতে বসবাস করে?

সুতরাং,

স্ট্রিংSystem নামস্থান উপস্থিত ।

এবং

স্ট্রিংবিল্ডারSystem.Text নেমস্পেসে উপস্থিত ।

জন্য স্ট্রিং ঘোষণা:

আপনাকে Systemনামের স্থানটি অন্তর্ভুক্ত করতে হবে । এটার মতো কিছু. Using System;

এবং

জন্য StringBuilder ঘোষণা:

আপনাকে System.textনামের স্থানটি অন্তর্ভুক্ত করতে হবে । এটার মতো কিছু. Using System.text;

আসুন আসল প্রশ্ন।

স্ট্রিং এবং স্ট্রিংবিল্ডারের মধ্যে পার্থক্য কী ?

এই দুটিয়ের মধ্যে প্রধান পার্থক্য হ'ল:

স্ট্রিং অপরিবর্তনীয়।

এবং

স্ট্রিংবিল্ডার পরিবর্তনযোগ্য।

তাই এখন এর মধ্যে পার্থক্য আলোচনা করতে দেয় অপরিবর্তনীয় এবং চপল

পরিবর্তনীয়: অর্থ পরিবর্তনযোগ্য।

অপরিবর্তনীয় : অর্থ পরিবর্তনযোগ্য নয়।

উদাহরণ স্বরূপ:

using System;

namespace StringVsStrigBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            // String Example

            string name = "Rehan";
            name = name + "Shah";
            name = name + "RS";
            name = name + "---";
            name = name + "I love to write programs.";

            // Now when I run this program this output will be look like this.
            // output : "Rehan Shah RS --- I love to write programs."
        }
    }
}

সুতরাং এই ক্ষেত্রে আমরা একই জিনিস 5 বার পরিবর্তন করতে যাচ্ছি।

তাহলে ওবুইস প্রশ্নটি হ'ল! প্রকৃতপক্ষে হুডের নীচে কী ঘটে থাকে, যখন আমরা একই স্ট্রিংটি 5 বার পরিবর্তন করি।

আমরা যখন একই স্ট্রিংটি 5 বার পরিবর্তন করি তখন এটিই ঘটে।

চিত্রটি দেখুন।

এখানে চিত্র বর্ণনা লিখুন

Explaination:

যখন আমরা প্রথমে এই পরিবর্তনশীল "নাম "টিকে" রেহান "তে শুরু করি অর্থাৎ string name = "Rehan" এই ভেরিয়েবলটি স্ট্যাক" নাম "এ তৈরি হয় এবং সেই" রেহান "মানটির দিকে ইশারা করে। এই লাইনটি কার্যকর করার পরে: "নাম = নাম +" "শাহ" the

তাই stringঅপরিবর্তনীয় অর্থ যে একবার আমরা মেমরি অবজেক্ট তৈরি আমরা তাদের পরিবর্তন করতে পারবেন না হয়।

সুতরাং যখন আমরা nameভেরিয়েবলটি সংহত করি তখন পূর্ববর্তী অবজেক্টটি মেমোরিতে থাকে এবং অন্য একটি নতুন স্ট্রিং অবজেক্ট তৈরি হয় ...

সুতরাং উপরের চিত্রটি থেকে আমাদের পাঁচটি বস্তু রয়েছে চারটি বস্তু ফেলে দেওয়া হয়েছে তারা মোটেই ব্যবহৃত হয় না। এগুলি স্মৃতিতে থেকে যায় এবং মেমরির পরিমাণ কমিয়ে দেয়। "আবর্জনা সংগ্রাহক" এর জন্য দায়ী এটি এতটাই পরিষ্কার যে স্মৃতি থেকে উত্সগুলি।

সুতরাং স্ট্রিংয়ের ক্ষেত্রে যখনই আমরা বারবার স্ট্রিংটি বারবার হেরফের করি তখন আমাদের কাছে অনেকগুলি অবজেক্ট তৈরি হয় উত্তরগুলি মেমোরিতে থাকে।

সুতরাং এটি স্ট্রিং ভেরিয়েবলের গল্প।

এখন স্ট্রিংবিল্ডার অবজেক্টের দিকে নজর দেওয়া যাক। উদাহরণ স্বরূপ:

using System;
using System.Text;

namespace StringVsStrigBuilder
{
    class Program
    {
        static void Main(string[] args)
        {
            // StringBuilder Example

            StringBuilder name = new StringBuilder();
            name.Append("Rehan");
            name.Append("Shah");
            name.Append("RS");
            name.Append("---");
            name.Append("I love to write programs.");


            // Now when I run this program this output will be look like this.
            // output : "Rehan Shah Rs --- I love to write programs."
        }
    }
}

সুতরাং এই ক্ষেত্রে আমরা একই জিনিস 5 বার পরিবর্তন করতে যাচ্ছি।

তাহলে ওবুইস প্রশ্নটি হ'ল! প্রকৃতপক্ষে হুডের নীচে কী ঘটে থাকে, যখন আমরা একই স্ট্রিংবিল্ডারটি 5 বার পরিবর্তন করি।

যখন আমরা একই স্ট্রিংবিল্ডারকে 5 বার পরিবর্তন করি তখন এটিই ঘটে।

চিত্রটি দেখুন। এখানে চিত্র বর্ণনা লিখুন

ব্যাখ্যা: স্ট্রিংবিল্ডার অবজেক্টের ক্ষেত্রে। আপনি নতুন বস্তু পাবেন না। একই অবজেক্টটি মেমোরিতে পরিবর্তিত হবে সুতরাং আপনি যদি বস্তুটি পরিবর্তন করেন এবং 10,000 বার বলেন তবে আমাদের কাছে এখনও কেবল একটি স্ট্রিংবিল্ডার অবজেক্ট থাকবে।

আপনার কাছে প্রচুর আবর্জনা অবজেক্টস বা অ-রেফারেন্সযুক্ত স্ট্রিং বিল্ডার অবজেক্ট নেই কারণ এটি কেন পরিবর্তন হতে পারে। এটি পরিবর্তিত অর্থ এটি একটি সময়ের সাথে পরিবর্তিত হয়?

পার্থক্য:

  • স্ট্রিং সিস্টেম নেমস্পেসে উপস্থিত রয়েছে যেখানে স্ট্রিং বিল্ডার হিসাবে সিস্টেমের উপস্থিত রয়েছে। পাঠ্য নেমস্পেস।
  • স্ট্রিং অপরিবর্তনীয় যেখানে স্ট্রিংবিল্ডার হিসাবে মুতাবে।

8

স্ট্রিংবিল্ডার অতিরিক্ত ব্যবহৃত মেমোরির ব্যয় করে বরাদ্দ এবং অ্যাসাইনমেন্টের সংখ্যা হ্রাস করে। সঠিকভাবে ব্যবহার করা হলে, ফলাফলটি না পাওয়া পর্যন্ত এটি কমপায়ারের বড় এবং বৃহত্তর স্ট্রিংগুলি বরাদ্দ করার জন্য সম্পূর্ণরূপে অপসারণ করতে পারে।

string result = "";
for(int i = 0; i != N; ++i)
{
   result = result + i.ToString();   // allocates a new string, then assigns it to result, which gets repeated N times
}

বনাম

String result;
StringBuilder sb = new StringBuilder(10000);   // create a buffer of 10k
for(int i = 0; i != N; ++i)
{
   sb.Append(i.ToString());          // fill the buffer, resizing if it overflows the buffer
}

result = sb.ToString();   // assigns once

5

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

সূত্র: এমএসডিএন


3

StringBuilder অনেক অ-ধ্রুবক মান থেকে স্ট্রিং তৈরির পক্ষে ভাল।

যদি আপনি অনেকগুলি ধ্রুবক মান থেকে স্ট্রিং তৈরি করে থাকেন, যেমন এইচটিএমএল বা এক্সএমএল ডকুমেন্টে মানগুলির একাধিক লাইন বা পাঠ্যের অন্যান্য অংশ, আপনি কেবল একই স্ট্রিংয়ের সাথে যুক্ত করে চলে যেতে পারেন, কারণ প্রায় সমস্ত সংকলকই করেন "ধ্রুবক ভাঁজ", যখন আপনার একগুচ্ছ ধ্রুবক ম্যানিপুলেশন থাকে তখন পার্স গাছ হ্রাস করার প্রক্রিয়া (এটি যখন আপনি কিছু লিখেন তখনও ব্যবহৃত হয় int minutesPerYear = 24 * 365 * 60)। এবং একে অপরের সাথে সংযুক্ত অ-ধ্রুবক মান সহ সাধারণ ক্ষেত্রে StringBuilder,। নেট সংকলকটি আপনার কোডকে যা কিছু করে তার মতো করে কিছুটা কমিয়ে দেবে ।

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


2

আমি বিশ্বাস করি আপনার কাছে 4 টিরও বেশি স্ট্রিং একসাথে সংযোজন করার দরকার থাকলে স্ট্রিংবিল্ডার দ্রুত। এছাড়াও এটি অ্যাপেন্ডলাইন জাতীয় কিছু দুর্দান্ত জিনিস করতে পারে।


2

.NET- এ, স্ট্রিংবিল্ডার এখনও স্ট্রিং যুক্ত করার চেয়ে দ্রুত। আমি দৃ sure়ভাবে নিশ্চিত যে জাভাতে, তারা যখন আপনি স্ট্রিং সংযোজন করেন তখন তারা হুডের নীচে কেবল একটি স্ট্রিংবফার তৈরি করে, তাই আসলেই কোনও পার্থক্য নেই। আমি নিশ্চিত না যে তারা। নেট এ এখনও এটি করেন নি।



2

সংক্ষিপ্তকরণের জন্য স্ট্রিংগুলি ব্যবহারের ক্রমে রানটাইম জটিলতা দেখা দিতে পারে O(n^2)

আপনি যদি একটি ব্যবহার StringBuilderকরেন তবে মেমরির অনেক কম অনুলিপি করতে হবে যা করতে হবে। সঙ্গে StringBuilder(int capacity)যদি আপনি অনুমান করতে পারেন কত বড় চূড়ান্ত কর্মক্ষমতা বৃদ্ধি করতে পারেন Stringহতে যাচ্ছে। এমনকি যদি আপনি সুনির্দিষ্ট না হন তবে আপনাকে সম্ভবত কেবল StringBuilderকয়েক বারের ক্ষমতা বৃদ্ধি করতে হবে যা পারফরম্যান্সেও সহায়তা করতে পারে।


2

যে কোনও স্ট্রিং স্টোরেজের জন্য এটি ব্যবহার করার আগে আমি ম্যাসথ EnsureCapacity(int capacity)কলটি ব্যবহার করে গুরুত্বপূর্ণ পারফরম্যান্স লাভ দেখেছি StringBuilder। আমি ইনস্ট্যান্টেশন পরে সাধারণত কোড লাইনে কল। এটির মতো একই প্রভাব রয়েছে আপনি যদি এটি StringBuilderপছন্দ করেন:

var sb = new StringBuilder(int capacity);

এই কলটি সময়ের আগে প্রয়োজনীয় মেমরির বরাদ্দ দেয় যা একাধিক Append()ক্রিয়াকলাপের সময় কম মেমরির বরাদ্দ দেয় । আপনার কত স্মৃতি প্রয়োজন হবে সে সম্পর্কে আপনাকে শিক্ষিত অনুমান করতে হবে তবে বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য এটি খুব বেশি কঠিন হওয়া উচিত নয়। আমি সাধারণত খুব বেশি স্মৃতির পাশে ভুল করি (আমরা 1 কে বা আরও কথা বলছি)।


তাত্ক্ষণিকতার EnsureCapacityপরে কল করার দরকার নেই StringBuilder। কেবলমাত্র instantiate StringBuilderভালো: var sb = new StringBuilder(int capacity)
ডেভিড ফেরেঞ্জি রোগোয়ান

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

1

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

আইএমএইচও, 500+ স্ট্রিং এন্ট্রি যুক্ত করে অবশ্যই স্ট্রিংবিল্ডার ব্যবহার করা উচিত।


1

স্ট্রিং এবং স্ট্রিংবিল্ডার উভয়ই অপরিবর্তনীয়, স্ট্রিংবিল্ডার বাফারে তৈরি করেছেন যা এর আকার আরও দক্ষতার সাথে পরিচালিত করতে দেয়। যখন স্ট্রিংবিল্ডারকে পুনরায় আকার দেওয়ার দরকার হয় যখন এটি গাদাতে পুনরায় বরাদ্দ করা হয়। ডিফল্টরূপে এটি 16 টি অক্ষরের আকারের হয়, আপনি এটি কনস্ট্রাক্টরে সেট করতে পারেন।

যেমন।

স্ট্রিংবিল্ডার এসবি = নতুন স্ট্রিংবিল্ডার (50);


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

1

স্ট্রিং কনটেনটেশন আপনাকে আরও বেশি ব্যয় করবে। জাভাতে, আপনি আপনার প্রয়োজনের ভিত্তিতে স্ট্রিংবুফার বা স্ট্রিংবুডার ব্যবহার করতে পারেন। আপনি যদি একটি সিঙ্ক্রোনাইজড এবং থ্রেড নিরাপদ প্রয়োগ করতে চান তবে স্ট্রিংবফারের জন্য যান। এটি স্ট্রিং কনটেন্টেশনের চেয়ে দ্রুত হবে।

আপনার যদি সিঙ্ক্রোনাইজ বা থ্রেড নিরাপদ প্রয়োগের প্রয়োজন না হয় তবে স্ট্রিংবিল্ডারের জন্য যান। এটি স্ট্রিং কনটেনটেশনের চেয়ে দ্রুত এবং স্ট্রিংবফারের থেকেও তত দ্রুত হবে কারণ এগুলির কোনও সিঙ্করাইজেশন ওভারহেড নেই।


0

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


0

যদি আপনি প্রচুর স্ট্রিং কনটেনটেশন করে থাকেন তবে একটি স্ট্রিংবিল্ডার ব্যবহার করুন। আপনি যখন কোনও স্ট্রিং দিয়ে কনক্যাটেনেট করেন, আপনি প্রতিবার আরও মেমরি ব্যবহার করে একটি নতুন স্ট্রিং তৈরি করেন।

অ্যালেক্স


0

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


0

4 বা ততোধিক স্ট্রিংগুলি সংঘবদ্ধ করার সময় আমার স্ট্রিংবিল্ডারটি সর্বদা ব্যবহার করা উচিত বা যখন আমি জানি না যে কীভাবে কনটেন্টেশনগুলি অনুষ্ঠিত হতে পারে।

এটি এখানে ভাল পারফরম্যান্স সম্পর্কিত নিবন্ধ


0

StringBuilder উল্লেখযোগ্যভাবে আরও দক্ষ তবে আপনি যদি না প্রচুর পরিমাণে স্ট্রিং পরিবর্তন না করেন তবে আপনি সেই কার্য সম্পাদন দেখতে পাবেন না।

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

আপনি দেখতে পাচ্ছেন যে 200,000 পুনরাবৃত্তি 22 সেকেন্ডে নিয়েছে যখন 1 মিলিয়ন পুনরাবৃত্তি StringBuilderপ্রায় তাত্ক্ষণিক ছিল।

string s = string.Empty;
StringBuilder sb = new StringBuilder();

Console.WriteLine("Beginning String + at " + DateTime.Now.ToString());

for (int i = 0; i <= 50000; i++)
{
    s = s + 'A';
}

Console.WriteLine("Finished String + at " + DateTime.Now.ToString());
Console.WriteLine();

Console.WriteLine("Beginning String + at " + DateTime.Now.ToString());

for (int i = 0; i <= 200000; i++)
{
    s = s + 'A';
}

Console.WriteLine("Finished String + at " + DateTime.Now.ToString());
Console.WriteLine();
Console.WriteLine("Beginning Sb append at " + DateTime.Now.ToString());

for (int i = 0; i <= 1000000; i++)
{
    sb.Append("A");
}
Console.WriteLine("Finished Sb append at " + DateTime.Now.ToString());

Console.ReadLine();

উপরের কোডের ফলাফল:

28/01/2013 16:55:40 এ + স্ট্রিং শুরু করা।

স্ট্রিং + 28/01/2013 16:55:40 এ শেষ হয়েছে।

28/01/2013 16:55:40 এ + স্ট্রিং শুরু করা।

স্ট্রিং + 28/01/2013 16:56:02 এ শেষ হয়েছে।

28/01/2013 16:56:02 এ এসবি সংযোজন শুরু করা।

28/01/2013 16:56:02 এ এসবি সংযোজন শেষ হয়েছে।


1
স্ট্রিং বিল্ডার যদি এত শক্তিশালী হয় তবে স্ট্রিং আমাদের কেন বিদ্যমান। কেন আমরা স্ট্রিং পুরোপুরি মুছবেন না। আমি এই প্রশ্ন জিজ্ঞাসা যাতে আপনি আমাকে StringBuilder উপর স্ট্রিং সুবিধার বলতে পারেন
অলঙ্ঘনীয়

-2

স্ট্রিংবিল্ডার একটি মেমরি স্ট্যান্ড পয়েন্ট থেকে আরও ভাল অভিনয় করবেন। প্রক্রিয়াজাতকরণ হিসাবে, মৃত্যুদন্ড কার্যকর সময় পার্থক্য নগণ্য হতে পারে।

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