মূলত, এর উপর পুনরাবৃত্তি করতে একটি লুপ ব্যবহার করা ArrayList
একমাত্র বিকল্প:
এই কোডটি ব্যবহার করবেন না, কেন এটি পছন্দসই নয় এবং এর পরিবর্তে কোন কোডটি ব্যবহার করা উচিত তা দেখতে এই উত্তরটির নীচে পড়া চালিয়ে যান:
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
String listString = "";
for (String s : list)
{
listString += s + "\t";
}
System.out.println(listString);
প্রকৃতপক্ষে, একটি স্ট্রিং কনটেনটেশন ঠিক জরিমানা হতে চলেছে, কারণ javac
সংকলক যেভাবেই হোক না কেন append
ক্রিয়াকলাপের সিরিজ হিসাবে স্ট্রিং কনটেনটেশনকে অনুকূল করে তুলবে StringBuilder
। for
উপরের প্রোগ্রামটি থেকে লুপ থেকে বাইটকোডকে বিচ্ছিন্ন করার একটি অংশ এখানে দেওয়া হয়েছে :
61: new #13; //class java/lang/StringBuilder
64: dup
65: invokespecial #14; //Method java/lang/StringBuilder."<init>":()V
68: aload_2
69: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: aload 4
74: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
77: ldc #16; //String \t
79: invokevirtual #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
82: invokevirtual #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
যেমন দেখা যায়, সংকলকটি এটিকে ব্যবহার করে সেই লুপটিকে অনুকূল করে StringBuilder
, তাই পারফরম্যান্স বড় উদ্বেগ হওয়া উচিত নয়।
(ঠিক আছে, দ্বিতীয় নজরে উপর, StringBuilder
লুপ প্রতিটি পুনরাবৃত্তির উপর একটি সুনির্দিষ্ট ব্যবহার instantiated হচ্ছে, তাই এটি সবচেয়ে বেশি কার্যকরী বাইটকোড নাও হতে পারে। শুরু করতে গিয়ে এবং StringBuilder
সম্ভবত ভাল পারফরম্যান্স উত্পাদ হবে।)
আসলে, আমি মনে করি যে কোনও ধরণের আউটপুট (তা ডিস্কে বা স্ক্রিনে) হওয়া স্ট্রিং কনটেন্টেশনের কার্যকারিতা সম্পর্কে চিন্তিত হওয়ার চেয়ে কমপক্ষে একটি প্রস্থের ধীরে ধীরে কম হবে।
সম্পাদনা: মন্তব্যে নির্দেশিত হিসাবে, উপরোক্ত সংকলক অপ্টিমাইজেশন প্রকৃতপক্ষে StringBuilder
প্রতিটি পুনরাবৃত্তির উপর একটি নতুন উদাহরণ তৈরি করছে। (যা আমি আগে উল্লেখ করেছি।)
ব্যবহারের জন্য সবচেয়ে অপ্টিমাইজড কৌশলটি হ'ল পল টমবলিনের প্রতিক্রিয়া , কারণ এটি কেবল লুপের StringBuilder
বাইরে কোনও একক বস্তুকে ইনস্ট্যান্ট করে for
।
উপরের কোডটিতে আবার লিখন:
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
StringBuilder sb = new StringBuilder();
for (String s : list)
{
sb.append(s);
sb.append("\t");
}
System.out.println(sb.toString());
কেবলমাত্র StringBuilder
একবার লুপের বাইরের দিকে তাত্ক্ষণিকভাবে কাজ করবে append
এবং এই বাইকোডে প্রমাণিত (যা StringBuilder
লুপের ইনস্ট্যান্টেশন এবং লুপটি দেখায় ) হিসাবে লুপের অভ্যন্তরে পদ্ধতিতে কেবল দুটি কল করবে :
// Instantiation of the StringBuilder outside loop:
33: new #8; //class java/lang/StringBuilder
36: dup
37: invokespecial #9; //Method java/lang/StringBuilder."<init>":()V
40: astore_2
// [snip a few lines for initializing the loop]
// Loading the StringBuilder inside the loop, then append:
66: aload_2
67: aload 4
69: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
72: pop
73: aload_2
74: ldc #15; //String \t
76: invokevirtual #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
79: pop
সুতরাং, প্রকৃতপক্ষে হাতের অপ্টিমাইজেশনটি আরও ভালভাবে সম্পাদন করা উচিত, কারণ লুপটির অভ্যন্তরটি for
ছোট হয় এবং StringBuilder
প্রতিটি পুনরাবৃত্তির উপর একটি ইনস্ট্যান্ট করার দরকার নেই to