আমি জাভাতে কোনও লুপের অভ্যন্তরে বা বাইরে ভেরিয়েবলগুলি ঘোষনা দিলে কী পার্থক্য রয়েছে? [বন্ধ]


13

সম্ভাব্য সদৃশ: আপনি
কোথায় ভেরিয়েবল ঘোষণা করবেন? কোনও পদ্ধতির শীর্ষে বা আপনার যখন প্রয়োজন হয়?

আমি জাভাতে কোনও লুপের অভ্যন্তরে বা বাইরে ভেরিয়েবলগুলি ঘোষনা দিলে কী পার্থক্য রয়েছে?

এই কি

for(int i = 0; i < 1000; i++) {
   int temp = doSomething();
   someMethod(temp);
}

এর সমান (স্মৃতি ব্যবহারের ক্ষেত্রে)?

int temp = 0;
for(int i = 0; i < 1000; i++) {
   temp = doSomething();
   someMethod(temp);
}

এবং যদি অস্থায়ী পরিবর্তনশীল উদাহরণস্বরূপ একটি অ্যারেলিস্ট হয়?

for(int i = 0; i < 1000; i++) {
   ArrayList<Integer> array = new ArrayList<Integer>();
   fillArray(array);
   // do something with the array
}

সম্পাদনা: এর সাথে javap -cআমি নিম্নলিখিত আউটপুট পেয়েছি

লুপের বাইরে পরিবর্তনশীল:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iconst_0      
       3: istore_2      
       4: iload_2       
       5: sipush        1000
       8: if_icmpge     25
      11: invokestatic  #2                  // Method doSomething:()I
      14: istore_1      
      15: iload_1       
      16: invokestatic  #3                  // Method someMethod:(I)V
      19: iinc          2, 1
      22: goto          4
      25: return  

লুপের ভিতরে পরিবর্তনশীল:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: sipush        1000
       6: if_icmpge     23
       9: invokestatic  #2                  // Method doSomething:()I
      12: istore_2      
      13: iload_2       
      14: invokestatic  #3                  // Method someMethod:(I)V
      17: iinc          1, 1
      20: goto          2
      23: return        

এবং আগ্রহীদের জন্য, এই কোড:

public class Test3 {
    public static void main(String[] args) {
        for(int i = 0; i< 1000; i++) {
            someMethod(doSomething());
        }   
    }
    private static int doSomething() {
        return 1;
    }
    private static void someMethod(int temp) {
        temp++;
    }
}

এটি উত্পাদন করে:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: sipush        1000
       6: if_icmpge     21
       9: invokestatic  #2                  // Method doSomething:()I
      12: invokestatic  #3                  // Method someMethod:(I)V
      15: iinc          1, 1
      18: goto          2
      21: return   

তবে অপটিমাইজেশনটি তখন রানটাইমে ঘটে। অপ্টিমাইজড কোডটি দেখার কোনও উপায় আছে কি? (দীর্ঘ EDIT এর জন্য দুঃখিত)


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

হ্যাঁ, আমি অনুকূলিত কোডটি পাওয়ার চেষ্টা করব। (প্রশ্নটি খানিকটা বদলে গেল, আমি সম্পাদনায় অনুকূলিত কোড সহ জিনিসটি জিজ্ঞাসা করেছি)
পাকল

সদৃশটিতে ভাঙা লিঙ্ক। এই প্রশ্নটিকে আসল করার সময় এসেছে।
জোন

উত্তর:


4

এগুলির বেশিরভাগ প্রশ্নের সাধারণ উত্তর হওয়া উচিত "কেন আপনি এটি চেষ্টা করে খুঁজে বের করেন না?"। ভেরিয়েবলটি ঘোষণার সেই দুটি পদ্ধতির মধ্যে বাইট কোডের পার্থক্য কী তা দেখতে জাভাতে আপনি সম্ভবত জেনারেটেড বাইটকোডের (আমি বিশ্বাস করি যে সরঞ্জামটি জাভ্যাপ বলা হয়) একবার দেখে নিতে পারেন।

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


3

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

এখানে গৃহীত উত্তর: /software//a/56590/43451


আপনি যখন লুপটির ভিতরে একটি নতুন অবজেক্ট তৈরি করেন তখন সেই পারফরম্যান্স সম্পর্কে কী বলা যায়, যা কেবল একবারই তৈরি করা যায়?
বুদ্বুদ্বন্ধ

3
এই ক্ষেত্রে অবশ্যই কর্মক্ষমতা এবং মেমরি পেনাল্টি আছে। তবে
অপটির

1
লিঙ্কটি নষ্ট হয়ে গেছে।
জোন

1

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

এছাড়াও, ভেরিয়েবলকে সবচেয়ে ছোট সম্ভাব্য সুযোগ দেওয়া আরও ভাল স্টাইল। এটি দুর্ঘটনা রোধ করে।


এটি সত্য নয় - জেভিএম স্তরে স্থানীয় ভেরিয়েবলের সীমিত সুযোগের মতো জিনিস নেই।
মাইকেল বর্গওয়ার্ট

আপনি কি বোঝাতে চেয়েছেন যে আমি যদি 1000 বার লিখি (int i = ..) 1000 বার লিখি, ফাংশনটি থেকে প্রস্থান করার সময় স্ট্যাকের মধ্যে 1000 টি বিভিন্ন ভেরিয়েবল থাকবে?
ddyer

artima.com/insidejvm/ed2/jvm8.html অনুসারে "উদাহরণস্বরূপ, যদি দুটি স্থানীয় ভেরিয়েবলের সীমিত স্কোপ থাকে যেগুলি ওভারল্যাপ করে না, যেমন উদাহরণ3 বি তে i এবং j স্থানীয় ভেরিয়েবলগুলি, সংকলকরা একই অ্যারে প্রবেশ ব্যবহার করতে পারবেন উভয় ভেরিয়েবলের জন্য। "এবং এটি কেবল অর্থবোধ করে, সংকলকরা এইভাবে স্ট্যাক ফ্রেমের আকারকে অনুকূল করতে মুক্ত।
ddyer

1
ভাল যুক্তি; তবে আমরা যদি সংকলক অপ্টিমাইজেশনের কথা বলি তবে সংকলক প্রায় সহজেই স্থানীয় ভেরিয়েবল এন্ট্রিগুলিকে ভেরিয়েবলগুলির জন্য পুনরায় ব্যবহার করতে পারে যার মধ্যে ওভারল্যাপিং লেক্সিকাল স্কোপ রয়েছে তবে ওভারল্যাপিং পদ্ধতিতে ব্যবহৃত হয় না ।
মাইকেল বর্গওয়ার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.