প্রশ্নটি এখন (এখন) প্রচুর ডেটা সংরক্ষণ করার বিষয়ে, যা int
মানচিত্রে আদিম ধরণের ব্যবহার করে উপস্থাপন করা যেতে পারে । এখানে কিছু উত্তর আমার মতে খুব বিভ্রান্তিকর। দেখা যাক কেন।
রানটাইম এবং মেমরি উভয় খরচ উভয়ই পরিমাপ করতে আমি ট্র্যাভ থেকে মানদণ্ডটি সংশোধন করেছি । আমি এই বেঞ্চমার্কে পিসিজেও যুক্ত করেছি , এটি আদিম ধরণের জন্য আরেকটি সংগ্রহ গ্রন্থাগার (আমি এটি একটি ব্যাপকভাবে ব্যবহার করি)। 'অফিসিয়াল' ট্রভ বেঞ্চমার্কটি ইন্টারন্টম্যাপগুলি জাভা সংগ্রহের সাথে তুলনা করে না Map<Integer, Integer>
, সম্ভবত সঞ্চয় Integers
এবং সংরক্ষণ ints
প্রযুক্তিগত দৃষ্টিকোণ থেকে এক নয়। তবে কোনও ব্যবহারকারীর এই প্রযুক্তিগত বিশদ সম্পর্কে যত্নশীল হতে পারে না, তিনি ints
দক্ষতার সাথে উপস্থাপনযোগ্য ডেটা সংরক্ষণ করতে চান ।
প্রথমে কোডের প্রাসঙ্গিক অংশ:
new Operation() {
private long usedMem() {
System.gc();
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
// trove
public void ours() {
long mem = usedMem();
TIntIntHashMap ours = new TIntIntHashMap(SET_SIZE);
for ( int i = dataset.size(); i-- > 0; ) {
ours.put(i, i);
}
mem = usedMem() - mem;
System.err.println("trove " + mem + " bytes");
ours.clear();
}
public void pcj() {
long mem = usedMem();
IntKeyIntMap map = new IntKeyIntOpenHashMap(SET_SIZE);
for ( int i = dataset.size(); i-- > 0; ) {
map.put(i, i);
}
mem = usedMem() - mem;
System.err.println("pcj " + mem + " bytes");
map.clear();
}
// java collections
public void theirs() {
long mem = usedMem();
Map<Integer, Integer> map = new HashMap<Integer, Integer>(SET_SIZE);
for ( int i = dataset.size(); i-- > 0; ) {
map.put(i, i);
}
mem = usedMem() - mem;
System.err.println("java " + mem + " bytes");
map.clear();
}
আমি ধরে নিই যে ডেটাটি আদিম হিসাবে আসে ints
যা বুদ্ধিমান বলে মনে হয়। তবে এটি জাভা ব্যবহারের জন্য রানটাইম জরিমানা বোঝায়, কারণ অটো-বক্সিং, যা আদিম সংগ্রহের কাঠামোর জন্য প্রয়োজনীয় নয়।
উইনএক্সপিতে রানডটাইম ফলাফল ( gc()
অবশ্যই কল ছাড়াই ), jdk1.6.0_10:
100000 পুট অপারেশন 100000 অপারেশন রয়েছে
জাভা সংগ্রহগুলি 1938 এমএস 203 এমএস
ট্রভ 234 এমএস 125 এমএস
পিসিজে 516 এমএস 94 এমএস
যদিও এটি ইতিমধ্যে কঠোর মনে হচ্ছে, এই জাতীয় কাঠামো ব্যবহার করার কারণ এটি নয়।
কারণ স্মৃতি কর্মক্ষমতা। 100000 এন্ট্রিযুক্ত মানচিত্রের ফলাফল int
:
জাভা সংগ্রহগুলি 6644536 এবং 7168840 বাইটের মধ্যে দোলনা দেয়
1853296 বাইট ট্রভ
পিসিজে 1866112 বাইট
আদিম সংগ্রহ ফ্রেমওয়ার্কগুলির তুলনায় জাভা সংগ্রহগুলি তিনবারের বেশি মেমরির প্রয়োজন। অর্থাৎ আপনি ডিস্ক আইও অবলম্বন না করে মেমোরিতে তিনগুণ বেশি ডেটা রাখতে পারেন যা রানটাইমের কর্মক্ষমতাকে বাড়িয়ে তোলে। এবং এই বিষয়গুলি। কেন তা জানতে হাইস্ক্যাবিলিটি পড়ুন ।
আমার অভিজ্ঞতায় উচ্চ স্মৃতিশক্তি খরচ জাভায় সবচেয়ে বড় পারফরম্যান্স সমস্যা, যার ফলস্বরূপ খারাপ রানটাইম পারফরম্যান্সেরও ফলস্বরূপ। আদিম সংগ্রহের ফ্রেমওয়ার্কগুলি এখানে সত্যই সহায়তা করতে পারে।
সুতরাং: না, java.util এর উত্তর নয়। দক্ষতা সম্পর্কে জিজ্ঞাসা করার সময় জাভা সংগ্রহগুলিতে "কার্যকারিতা যুক্ত করা" মুখ্য বিষয় নয়। এছাড়াও আধুনিক JDK সংগ্রহ না না "এমনকি বিশেষ Trove সংগ্রহের বাইরে সঞ্চালন"।
দাবি অস্বীকার: এখানে মাপদণ্ড সম্পূর্ণরূপে, না এটি নিখুঁত। এটি মূল পয়েন্টটি চালানোর উদ্দেশ্যে যা আমি অনেক প্রকল্পে অভিজ্ঞতা অর্জন করেছি। ফিশি এপিআই সহ্য করার জন্য আদিম সংগ্রহগুলি যথেষ্ট দরকারী - যদি আপনি প্রচুর ডেটা দিয়ে কাজ করেন।