পারফরম্যান্সের কারণে, +=
( String
কনটেন্টেশন) এর ব্যবহারকে নিরুৎসাহিত করা হয়। কারণটি হ'ল: জাভা String
একটি অপরিবর্তনীয়, প্রতিবার নতুন কনটেন্টেশন করার সময় একটি নতুন String
তৈরি করা হয় ( স্ট্রিং পুলে ইতিমধ্যে পুরানোটির থেকে নতুনটির আলাদা ফিঙ্গারপ্রিন্ট রয়েছে )। নতুন স্ট্রিং তৈরি করা জিসির উপর চাপ সৃষ্টি করে এবং প্রোগ্রামটি ধীর করে দেয়: অবজেক্ট তৈরি ব্যয়বহুল।
নীচের কোডগুলিকে একই সময়ে আরও ব্যবহারিক এবং স্পষ্ট করা উচিত।
public static void main(String[] args)
{
// warming up
for(int i = 0; i < 100; i++)
RandomStringUtils.randomAlphanumeric(1024);
final StringBuilder appender = new StringBuilder();
for(int i = 0; i < 100; i++)
appender.append(RandomStringUtils.randomAlphanumeric(i));
// testing
for(int i = 1; i <= 10000; i*=10)
test(i);
}
public static void test(final int howMany)
{
List<String> samples = new ArrayList<>(howMany);
for(int i = 0; i < howMany; i++)
samples.add(RandomStringUtils.randomAlphabetic(128));
final StringBuilder builder = new StringBuilder();
long start = System.nanoTime();
for(String sample: samples)
builder.append(sample);
builder.toString();
long elapsed = System.nanoTime() - start;
System.out.printf("builder - %d - elapsed: %dus\n", howMany, elapsed / 1000);
String accumulator = "";
start = System.nanoTime();
for(String sample: samples)
accumulator += sample;
elapsed = System.nanoTime() - start;
System.out.printf("concatenation - %d - elapsed: %dus\n", howMany, elapsed / (int) 1e3);
start = System.nanoTime();
String newOne = null;
for(String sample: samples)
newOne = new String(sample);
elapsed = System.nanoTime() - start;
System.out.printf("creation - %d - elapsed: %dus\n\n", howMany, elapsed / 1000);
}
একটি রান জন্য ফলাফল নীচে রিপোর্ট করা হয়।
builder - 1 - elapsed: 132us
concatenation - 1 - elapsed: 4us
creation - 1 - elapsed: 5us
builder - 10 - elapsed: 9us
concatenation - 10 - elapsed: 26us
creation - 10 - elapsed: 5us
builder - 100 - elapsed: 77us
concatenation - 100 - elapsed: 1669us
creation - 100 - elapsed: 43us
builder - 1000 - elapsed: 511us
concatenation - 1000 - elapsed: 111504us
creation - 1000 - elapsed: 282us
builder - 10000 - elapsed: 3364us
concatenation - 10000 - elapsed: 5709793us
creation - 10000 - elapsed: 972us
1 টি কনটেনটেশনের ফলাফলগুলি বিবেচনা না করে (জেআইটি এখনও তার কাজটি করে নি), এমনকি 10 টি সম্মেলনের জন্য পারফরম্যান্সের শাস্তি প্রাসঙ্গিক; হাজার হাজার সম্মেলনের জন্য, পার্থক্যটি বিশাল।
এই তাত্ক্ষণিক পরীক্ষা থেকে শিখানো পাঠ (উপরের কোডটি দিয়ে সহজেই পুনরুত্পাদনযোগ্য): +=
স্ট্রিংগুলি একসাথে ব্যবহার করতে কখনও কখনও ব্যবহার করবেন না , এমনকি কয়েকটি মৌলিক ক্ষেত্রে যেখানে নতুন কনস্ট্রাকশন প্রয়োজন (যেমন বলা হয়েছে, নতুন স্ট্রিং তৈরি করা যে কোনও উপায়ে ব্যয়বহুল এবং চাপ সৃষ্টি করে) জিসি)।