স্থির পদ্ধতিতে অ্যাক্সেস পাবে না বলে এটি কিছুটা ছোট বাইকোডের ফলস্বরূপ হতে পারে this
। আমি মনে করি না এটি গতিতে কোনও পার্থক্য করে (এবং এটি যদি হয় তবে সামগ্রিকভাবে কোনও পার্থক্য করা খুব সামান্য হবে)।
আমি এগুলি স্থির করে তুলি, যেহেতু আমি যদি সম্ভব হয় তবে সাধারণত তা করি। তবে তা কেবল আমিই।
সম্পাদনা: বাইটকোড আকার সম্পর্কে অসমর্থিত দৃ as়তার কারণে সম্ভবত এই উত্তরটি নিম্নচাপিত হতে থাকবে। সুতরাং আমি আসলে একটি পরীক্ষা চালাতে হবে।
class TestBytecodeSize {
private void doSomething(int arg) { }
private static void doSomethingStatic(int arg) { }
public static void main(String[] args) {
// do it twice both ways
doSomethingStatic(0);
doSomethingStatic(0);
TestBytecodeSize t = new TestBytecodeSize();
t.doSomething(0);
t.doSomething(0);
}
}
বাইটকোড (এর সাথে পুনরুদ্ধার করা javap -c -private TestBytecodeSize
):
Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
private void doSomething(int);
Code:
0: return
private static void doSomethingStatic(int);
Code:
0: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: invokestatic #2; //Method doSomethingStatic:(I)V
4: iconst_0
5: invokestatic #2; //Method doSomethingStatic:(I)V
8: new #3; //class TestBytecodeSize
11: dup
12: invokespecial #4; //Method "<init>":()V
15: astore_1
16: aload_1
17: iconst_0
18: invokespecial #5; //Method doSomething:(I)V
21: aload_1
22: iconst_0
23: invokespecial #5; //Method doSomething:(I)V
26: return
}
স্থিতিশীল পদ্ধতিটি চালু করতে দুটি বাইকোড (বাইটপ?) লাগে: iconst_0
(যুক্তির জন্য) এবং invokestatic
।
স্থিতিশীল পদ্ধতিটি না নেওয়াতে তিনটি সময় লাগে: aload_1
( TestBytecodeSize
বস্তুর জন্য, আমি মনে করি), iconst_0
(যুক্তির জন্য), এবং invokespecial
। (মনে রাখবেন যে এগুলি যদি ব্যক্তিগত পদ্ধতি না হত তবে এটির invokevirtual
পরিবর্তে এটি হত invokespecial
; জেএলএস §7.7 আমন্ত্রণ পদ্ধতিগুলি দেখুন ))
এখন, যেমনটি আমি বলেছি, আমি আশা করি না যে এই দু'জনের মধ্যে পারফরম্যান্সে কোনও দুর্দান্ত পার্থক্য হবে, অন্যদিকে invokestatic
বাইকোডের জন্য আরও কিছু কম প্রয়োজন। invokestatic
এবং invokespecial
উভয়ই তুলনায় কিছুটা দ্রুত হওয়া উচিত invokevirtual
, যেহেতু তারা উভয়ই গতিশীলের পরিবর্তে স্থির বাইন্ডিং ব্যবহার করে, তবে অন্যটির চেয়ে দ্রুত হয় কিনা আমার কোনও ধারণা নেই। আমি কোন ভাল রেফারেন্স খুঁজে পাচ্ছি না। আমি সবচেয়ে নিকটে খুঁজে পাচ্ছি এই 1997 জাভাওয়ার্ল্ড নিবন্ধ , যা মূলত আমি যা বলেছিলাম তা পুনরুদ্ধার করে :
দ্রুততম নির্দেশাবলী সম্ভবত হবে invokespecial
এবং invokestatic
, কারণ এই নির্দেশাবলীর দ্বারা চালিত পদ্ধতিগুলি স্থিতিশীলভাবে আবদ্ধ। যখন জেভিএম এই নির্দেশাবলীর জন্য প্রতীকী রেফারেন্সটি সমাধান করে এবং এটিকে প্রত্যক্ষ রেফারেন্সের সাথে প্রতিস্থাপন করে, সেই প্রত্যক্ষ রেফারেন্সটি সম্ভবত প্রকৃত বাইকোডগুলিতে একটি পয়েন্টার অন্তর্ভুক্ত করবে।
তবে 1997 এর পরে অনেক কিছুই পরিবর্তিত হয়েছে।
সুতরাং উপসংহারে ... আমি অনুমান করি যে আমি আগে যা বলেছিলাম তা এখনও স্থির করছি। একে অপরের উপরে বাছাই করার কারণটি গতি হওয়া উচিত নয়, কারণ এটি সর্বোত্তমভাবে একটি মাইক্রো-অপ্টিমাইজেশন হবে।