আমি জাভা-তে নতুন 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)
এই নির্দিষ্ট পরীক্ষার জন্য, স্ট্রিমগুলি সংগ্রহের তুলনায় প্রায় দ্বিগুণ ধীর এবং সমান্তরালতা কোনও লাভ করে না (অথবা হয় আমি এটি ভুল উপায়ে ব্যবহার করছি?)।
প্রশ্নাবলী:
- এই পরীক্ষা কি মেলা? আমি কি কোন ভুল করেছি?
- স্ট্রিমগুলি কি সংগ্রহের চেয়ে ধীর? কেউ কি এই সম্পর্কে একটি ভাল আনুষ্ঠানিক মানদণ্ড তৈরি করেছে?
- আমার কোন পদ্ধতির জন্য চেষ্টা করা উচিত?
আপডেট ফলাফল।
আমি জেভিএম ওয়ার্মআপ (১ কে পুনরাবৃত্তি) এর পরে @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
পরিবর্তে এটি চেষ্টা করে ?