प्रदर्शन के कारणों के लिए, +=
( 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 निष्कर्षों के लिए प्रदर्शन जुर्माना प्रासंगिक है; हजारों सहमति के लिए, अंतर बहुत बड़ा है।
इस बहुत ही त्वरित प्रयोग से सीखे गए सबक (उपरोक्त कोड के साथ आसानी से प्रतिलिपि प्रस्तुत करने योग्य): कभी +=
भी एक साथ समवर्ती तारों का उपयोग न करें , यहां तक कि बहुत ही बुनियादी मामलों में जहां कुछ निष्कर्षों की आवश्यकता होती है (जैसा कि कहा गया है, नए तार बनाना वैसे भी महंगा है और दबाव डालता है) जीसी)।