मैं जावा 8 में नया हूं। मुझे अभी भी एपीआई की गहराई से जानकारी नहीं है, लेकिन मैंने नई स्ट्रीम एपीआई बनाम अच्छे पुराने संग्रह के प्रदर्शन की तुलना करने के लिए एक छोटा अनौपचारिक बेंचमार्क बनाया है।
परीक्षण में एक सूची को छानने के लिए होता है Integer
, और प्रत्येक सम संख्या के लिए, वर्गमूल की गणना करता है और इसके परिणामस्वरूप इसे संग्रहीत करता List
है Double
।
यहाँ कोड है:
public static void main(String[] args) {
//Calculating square root of even numbers from 1 to N
int min = 1;
int max = 1000000;
List<Integer> sourceList = new ArrayList<>();
for (int i = min; i < max; i++) {
sourceList.add(i);
}
List<Double> result = new LinkedList<>();
//Collections approach
long t0 = System.nanoTime();
long elapsed = 0;
for (Integer i : sourceList) {
if(i % 2 == 0){
result.add(Math.sqrt(i));
}
}
elapsed = System.nanoTime() - t0;
System.out.printf("Collections: Elapsed time:\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));
//Stream approach
Stream<Integer> stream = sourceList.stream();
t0 = System.nanoTime();
result = stream.filter(i -> i%2 == 0).map(i -> Math.sqrt(i)).collect(Collectors.toList());
elapsed = System.nanoTime() - t0;
System.out.printf("Streams: Elapsed time:\t\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));
//Parallel stream approach
stream = sourceList.stream().parallel();
t0 = System.nanoTime();
result = stream.filter(i -> i%2 == 0).map(i -> Math.sqrt(i)).collect(Collectors.toList());
elapsed = System.nanoTime() - t0;
System.out.printf("Parallel streams: Elapsed time:\t %d ns \t(%f seconds)%n", elapsed, elapsed / Math.pow(10, 9));
}.
और यहाँ एक दोहरी कोर मशीन के लिए परिणाम हैं:
Collections: Elapsed time: 94338247 ns (0,094338 seconds)
Streams: Elapsed time: 201112924 ns (0,201113 seconds)
Parallel streams: Elapsed time: 357243629 ns (0,357244 seconds)
इस विशेष परीक्षण के लिए, धाराएं संग्रह की तुलना में दो गुना धीमी हैं, और समानतावाद मदद नहीं करता है (या तो मैं इसे गलत तरीके से उपयोग कर रहा हूं?)।
प्रशन:
- क्या यह परीक्षण उचित है? क्या मैंने कोई गलती की है?
- क्या संग्रह की तुलना में धाराएँ धीमी हैं? क्या किसी ने इस पर एक अच्छा औपचारिक बेंचमार्क बनाया है?
- मुझे किस दृष्टिकोण के लिए प्रयास करना चाहिए?
अपडेट किए गए परिणाम।
जेवीएम वार्मअप (1k पुनरावृत्तियों) के बाद मैंने @pveentjer द्वारा सलाह के अनुसार परीक्षण 1k बार चलाया:
Collections: Average time: 206884437,000000 ns (0,206884 seconds)
Streams: Average time: 98366725,000000 ns (0,098367 seconds)
Parallel streams: Average time: 167703705,000000 ns (0,167704 seconds)
इस मामले में धाराएँ अधिक प्रदर्शनकारी हैं। मुझे आश्चर्य है कि एक ऐप में क्या देखा जाएगा जहां फ़िल्टरिंग फ़ंक्शन केवल रनटाइम के दौरान एक या दो बार कहा जाता है।
toList
समानांतर में चलना चाहिए भले ही यह एक गैर-थ्रेड-सुरक्षित सूची में एकत्रित हो, क्योंकि विभिन्न धागे विलय होने से पहले थ्रेड-सीमित इंटरमीडिएट सूचियों में एकत्रित हो जाएंगे।
IntStream
इसके बजाय कोशिश की है ?