এই উত্তরটি লুপগুলির বিভিন্ন বাস্তবায়নের কর্মক্ষমতা নিয়ে নিজেকে উদ্বেগ দেয়। এটি কেবলমাত্র লুপগুলির জন্য প্রান্তিকভাবে প্রাসঙ্গিক that বেশিরভাগ ক্ষেত্রে লুপের সামগ্রীটি সবচেয়ে ব্যয়বহুল উপাদান হবে be আপনি প্রায়শই লুপ করেন এমন পরিস্থিতিতে, এটি এখনও আগ্রহী হতে পারে।
আপনার লক্ষ্য নির্ধারণী সিস্টেমের অধীনে এই পরীক্ষাগুলি পুনরাবৃত্তি করা উচিত কারণ এটি প্রয়োগের নির্দিষ্ট, ( পুরো উত্স কোড )।
আমি একটি দ্রুত লিনাক্স মেশিনে 1.8.0_111 খুলুন।
আমি একটি পরীক্ষা লিখেছি যা বিভিন্ন কোডের integers
(10 ^ 0 -> 10 ^ 5 এন্ট্রি) সহ বিভিন্ন কোড ব্যবহার করে একটি তালিকাতে 10 List বার লুপ করে ^
ফলাফলগুলি নীচে রয়েছে, তালিকায় প্রবেশের পরিমাণের উপর নির্ভর করে দ্রুততম পদ্ধতিটি পরিবর্তিত হয়।
তবে এখনও সবচেয়ে খারাপ পরিস্থিতিতে, 10 ^ 5 টির বেশি লুপ করা 10 ^ 6 বার সবচেয়ে খারাপ অভিনয়কারীর জন্য 100 সেকেন্ড সময় নিয়েছে, সুতরাং অন্যান্য পরিস্থিতিতে কার্যত সমস্ত পরিস্থিতিতে আরও গুরুত্বপূর্ণ।
public int outside = 0;
private void forCounter(List<Integer> integers) {
for(int ii = 0; ii < integers.size(); ii++) {
Integer next = integers.get(ii);
outside = next*next;
}
}
private void forEach(List<Integer> integers) {
for(Integer next : integers) {
outside = next * next;
}
}
private void iteratorForEach(List<Integer> integers) {
integers.forEach((ii) -> {
outside = ii*ii;
});
}
private void iteratorStream(List<Integer> integers) {
integers.stream().forEach((ii) -> {
outside = ii*ii;
});
}
এখানে আমার সময়গুলি: মিলিসেকেন্ড / ফাংশন / তালিকায় প্রবেশের সংখ্যা। প্রতিটি রান 10 ^ 6 লুপ হয়।
1 10 100 1000 10000
iterator.forEach 27 116 959 8832 88958
for:each 53 171 1262 11164 111005
for with index 39 112 920 8577 89212
iterable.stream.forEach 255 324 1030 8519 88419
আপনি যদি পরীক্ষার পুনরাবৃত্তি করেন তবে আমি সম্পূর্ণ উত্স কোড পোস্ট করেছি । দয়া করে এই উত্তরটি সম্পাদনা করুন এবং পরীক্ষিত সিস্টেমের একটি স্বরলিপি দিয়ে ফলাফল যুক্ত করুন।
একটি ম্যাকবুক প্রো, 2.5 গিগাহার্টজ ইন্টেল কোর আই 7, 16 জিবি, ম্যাকস 10.12.6 ব্যবহার করুন:
1 10 100 1000 10000
iterator.forEach 27 106 1047 8516 88044
for:each 46 143 1182 10548 101925
for with index 49 145 887 7614 81130
iterable.stream.forEach 393 397 1108 8908 88361
জাভা 8 হটস্পট ভিএম - 3.4GHz ইন্টেল শিওন, 8 জিবি, উইন্ডোজ 10 প্রো
1 10 100 1000 10000
iterator.forEach 30 115 928 8384 85911
for:each 40 125 1166 10804 108006
for with index 30 120 956 8247 81116
iterable.stream.forEach 260 237 1020 8401 84883
জাভা ১১ হটস্পট ভিএম - ৩.৪ গিগাহার্টজ ইন্টেল শিওন, ৮ জিবি, উইন্ডোজ 10 প্রো
(উপরের মতো একই মেশিন, বিভিন্ন জেডিকে সংস্করণ)
1 10 100 1000 10000
iterator.forEach 20 104 940 8350 88918
for:each 50 140 991 8497 89873
for with index 37 140 945 8646 90402
iterable.stream.forEach 200 270 1054 8558 87449
জাভা 11 ওপেনজে 9 ভিএম - 3.4GHz ইন্টেল শিওন, 8 গিগাবাইট, উইন্ডোজ 10 প্রো
(একই মেশিন এবং জেডিকে সংস্করণ উপরে, বিভিন্ন ভিএম)
1 10 100 1000 10000
iterator.forEach 211 475 3499 33631 336108
for:each 200 375 2793 27249 272590
for with index 384 467 2718 26036 261408
iterable.stream.forEach 515 714 3096 26320 262786
জাভা 8 হটস্পট ভিএম - 2.8GHz এএমডি, 64 জিবি, উইন্ডোজ সার্ভার 2016
1 10 100 1000 10000
iterator.forEach 95 192 2076 19269 198519
for:each 157 224 2492 25466 248494
for with index 140 368 2084 22294 207092
iterable.stream.forEach 946 687 2206 21697 238457
জাভা ১১ হটস্পট ভিএম - ২.৮ গিগাহার্টজ এএমডি, GB৪ জিবি, উইন্ডোজ সার্ভার ২০১
((উপরের মতো একই মেশিন, বিভিন্ন জেডিকে সংস্করণ)
1 10 100 1000 10000
iterator.forEach 72 269 1972 23157 229445
for:each 192 376 2114 24389 233544
for with index 165 424 2123 20853 220356
iterable.stream.forEach 921 660 2194 23840 204817
জাভা 11 ওপেনজে 9 ভিএম - 2.8GHz এএমডি, 64 জিবি, উইন্ডোজ সার্ভার 2016
(একই মেশিন এবং জেডকে সংস্করণ উপরে, বিভিন্ন ভিএম)
1 10 100 1000 10000
iterator.forEach 592 914 7232 59062 529497
for:each 477 1576 14706 129724 1190001
for with index 893 838 7265 74045 842927
iterable.stream.forEach 1359 1782 11869 104427 958584
আপনি যে ভিএম নির্বাচন করেছেন তা হটস্পট / ওপেনজে 9 / ইত্যাদি ক্ষেত্রেও তাত্পর্যপূর্ণ।
Iterable.forEach takes the collection's lock
। কোথা থেকে এই তথ্য? আমি জেডিকে সূত্রে এ জাতীয় আচরণ খুঁজে পাচ্ছি না।