ताले का उपयोग करते समय आपको अपने आवेदन को धीमा करने की आवश्यकता नहीं है। यह मापने के लिए बहुत छोटा हो सकता है या यह आश्चर्यजनक रूप से उच्च हो सकता है।
आईएमएचओ अक्सर सबसे अच्छा तरीका एक थ्रेडेड प्रोग्राम में लॉक फ्री कोड का उपयोग करना है ताकि यह स्पष्ट हो सके कि यह कोड थ्रेड में साझा करने का इरादा नहीं है। यह किसी भी प्रदर्शन के मुद्दों की तुलना में रखरखाव के लिए और अधिक महत्वपूर्ण हो सकता है।
public static void main(String... args) throws IOException {
for (int i = 0; i < 3; i++) {
perfTest(new Vector<Integer>());
perfTest(new ArrayList<Integer>());
}
}
private static void perfTest(List<Integer> objects) {
long start = System.nanoTime();
final int runs = 100000000;
for (int i = 0; i < runs; i += 20) {
// add items.
for (int j = 0; j < 20; j+=2)
objects.add(i);
// remove from the end.
while (!objects.isEmpty())
objects.remove(objects.size() - 1);
}
long time = System.nanoTime() - start;
System.out.printf("%s each add/remove took an average of %.1f ns%n", objects.getClass().getSimpleName(), (double) time/runs);
}
प्रिंट
Vector each add/remove took an average of 38.9 ns
ArrayList each add/remove took an average of 6.4 ns
Vector each add/remove took an average of 10.5 ns
ArrayList each add/remove took an average of 6.2 ns
Vector each add/remove took an average of 10.4 ns
ArrayList each add/remove took an average of 5.7 ns
देखने के एक प्रदर्शन बिंदु से, अगर 4 एनएस आप के लिए महत्वपूर्ण है, तो आप गैर सिंक्रनाइज़ संस्करण का उपयोग करने के लिए है।
99% उपयोग मामलों के लिए, कोड की स्पष्टता प्रदर्शन की तुलना में अधिक महत्वपूर्ण है। साफ़, सरल कोड अक्सर उचित रूप से अच्छा प्रदर्शन करता है।
बीटीडब्लू: मैं ओरेकल जावा 7u1 के साथ 4.6 गीगाहर्ट्ज i7 2600 का उपयोग कर रहा हूं।
तुलना करने के लिए यदि मैं निम्नलिखित करता हूं तो perfTest1,2,3 समान हैं।
perfTest1(new ArrayList<Integer>());
perfTest2(new Vector<Integer>());
perfTest3(Collections.synchronizedList(new ArrayList<Integer>()));
मैं
ArrayList each add/remove took an average of 2.6 ns
Vector each add/remove took an average of 7.5 ns
SynchronizedRandomAccessList each add/remove took an average of 8.9 ns
मिलता है मैं एक आम perfTest
विधि का उपयोग यह कोड के रूप में बेहतर अनुरूप नहीं कर सकते हैं और वे कर रहे हैं सभी धीमी
ArrayList each add/remove took an average of 9.3 ns
Vector each add/remove took an average of 12.4 ns
SynchronizedRandomAccessList each add/remove took an average of 13.9 ns
परीक्षण के आदेश गमागमन
ArrayList each add/remove took an average of 3.0 ns
Vector each add/remove took an average of 39.7 ns
ArrayList each add/remove took an average of 2.0 ns
Vector each add/remove took an average of 4.6 ns
ArrayList each add/remove took an average of 2.3 ns
Vector each add/remove took an average of 4.5 ns
ArrayList each add/remove took an average of 2.3 ns
Vector each add/remove took an average of 4.4 ns
ArrayList each add/remove took an average of 2.4 ns
Vector each add/remove took an average of 4.6 ns
एक समय
ArrayList each add/remove took an average of 3.0 ns
ArrayList each add/remove took an average of 3.0 ns
ArrayList each add/remove took an average of 2.3 ns
ArrayList each add/remove took an average of 2.2 ns
ArrayList each add/remove took an average of 2.4 ns
और
Vector each add/remove took an average of 28.4 ns
Vector each add/remove took an average of 37.4 ns
Vector each add/remove took an average of 7.6 ns
Vector each add/remove took an average of 7.6 ns
Vector each add/remove took an average of 7.6 ns
अच्छा के रूप में, चीजों को विकसित किया है ** एक बहुत ** के बाद से यह दस साल पहले लिखा गया था। – NPE
संक्षिप्त उत्तर: यह करता है! – bestsss
लंबा उत्तर: हाँ। JVM को विकसित करने के बावजूद JVM को हमेशा यह हल करने की आवश्यकता होगी कि ऑब्जेक्ट की कुंजी उपलब्ध है या नहीं। –