इसका परिणाम थोड़ा छोटा बायटेकोड हो सकता है, क्योंकि स्थैतिक विधियों तक पहुंच नहीं होगी this
। मुझे नहीं लगता कि इससे गति में कोई फर्क पड़ता है (और अगर ऐसा किया जाता है, तो शायद यह बहुत छोटा होगा) कुल मिलाकर अंतर बनाने के लिए।
मैं उन्हें स्थिर कर दूंगा, क्योंकि मैं आम तौर पर ऐसा करता हूं यदि संभव हो तो। लेकिन वह सिर्फ मैं हूं।
EDIT: यह उत्तर नीचे की ओर जाता रहता है, संभवतः क्योंकि बायोटेक आकार के बारे में असंबद्ध जोर देने के कारण। इसलिए मैं वास्तव में एक परीक्षण चलाऊंगा।
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
}
स्थैतिक विधि को लागू करने के लिए दो बायटेकोड्स (byteops?) लगते हैं: iconst_0
(तर्क के लिए) और invokestatic
।
गैर-स्थैतिक विधि को लागू करने में तीन लगते हैं: aload_1
( TestBytecodeSize
ऑब्जेक्ट के लिए, मुझे लगता है), iconst_0
(तर्क के लिए), और invokespecial
। (ध्यान दें कि यदि ये निजी तरीके नहीं थे, तो यह invokevirtual
इसके बजाय होता invokespecial
, JLS if7.7 इनवॉइसिंग तरीके देखें ।)
अब, जैसा कि मैंने कहा, मुझे उम्मीद नहीं है कि इन दोनों के बीच प्रदर्शन में कोई बड़ा अंतर होगा, इस तथ्य के अलावा कि invokestatic
एक कम बायोटेक की आवश्यकता है। invokestatic
और invokespecial
दोनों की तुलना में थोड़ा तेज होना चाहिए invokevirtual
, क्योंकि वे दोनों गतिशील के बजाय स्थैतिक बंधन का उपयोग करते हैं, लेकिन मुझे नहीं पता कि क्या अन्य की तुलना में तेज है। मुझे कोई अच्छा संदर्भ भी नहीं मिल रहा है। निकटतम मैं पा सकता हूं यह 1997 का जावावर्ल्ड लेख है , जो मूल रूप से आराम करता है जो मैंने अभी कहा था:
सबसे तेज़ निर्देश सबसे अधिक संभावना होंगे invokespecial
और invokestatic
, क्योंकि इन निर्देशों द्वारा लागू किए गए तरीके सांख्यिकीय रूप से बाध्य हैं। जब JVM इन निर्देशों के लिए प्रतीकात्मक संदर्भ को हल करता है और इसे एक प्रत्यक्ष संदर्भ के साथ बदल देता है, तो उस प्रत्यक्ष संदर्भ में संभवत: वास्तविक बायटेकॉड्स के लिए एक सूचक शामिल होगा।
लेकिन 1997 से कई चीजें बदल गई हैं।
इसलिए निष्कर्ष में ... मुझे लगता है कि मैं अभी भी वही कह रहा हूं जो मैंने पहले कहा था। गति को दूसरे पर एक चुनने का कारण नहीं होना चाहिए, क्योंकि यह एक माइक्रो-ऑप्टिमाइज़ेशन होगा।