কিছু পরীক্ষার ফলাফল
আমি এই প্রশ্নের অনেক ভাল উত্তর পেয়েছি - ধন্যবাদ লোকেরা - তাই আমি কয়েকটি পরীক্ষা চালানোর সিদ্ধান্ত নিয়েছি এবং কোন পদ্ধতিটি আসলে দ্রুততম তা খুঁজে বের করার সিদ্ধান্ত নিয়েছি। আমি যে পাঁচটি পদ্ধতি পরীক্ষা করেছি সেগুলি হ'ল:
- "কনটেনস্কি" পদ্ধতিটি আমি প্রশ্নটিতে উপস্থাপন করেছি
- আলেকসান্দার দিমিত্রভ পরামর্শ দিয়েছেন "টেস্টফোরনুল" পদ্ধতি
- হ্যাঙ্ক গে দ্বারা প্রস্তাবিত "অ্যাটমিকলং" পদ্ধতি
- "ট্রভ" পদ্ধতিটি জ্রুডল্ফ দ্বারা প্রস্তাবিত
- phax.myopenid.com দ্বারা প্রস্তাবিত "MutableInt" পদ্ধতি
পদ্ধতি
আমি যা করেছি তা এখানে ...
- নীচে প্রদর্শিত পার্থক্য বাদে অভিন্ন ছিল এমন পাঁচটি শ্রেণি তৈরি করে। প্রতিটি ক্লাসকে আমি উপস্থাপিত দৃশ্যের একটি অপারেশন সঞ্চালন করতে হয়েছিল: একটি 10 এমবি ফাইল খোলার এবং এটি পড়তে, তারপরে ফাইলের সমস্ত টোকেন শব্দের একটি ফ্রিকোয়েন্সি গণনা সম্পাদন করা হয়। যেহেতু এটিতে গড়ে মাত্র 3 সেকেন্ড সময় লেগেছিল, তাই আমি 10 বার এটি ফ্রিকোয়েন্সি গণনা (I / O নয়) সম্পাদন করেছি।
- 10 টি পুনরাবৃত্তির লুপটি টাইমড করে তবে আই / ও অপারেশন নয় এবং জাভা কুকবুকে আইয়ান ডারউইনের পদ্ধতিটি মূলত ব্যবহার করে মোট সময় (ঘড়ি সেকেন্ডে) রেকর্ড করা হয়েছে ।
- পাঁচটি সিরিজ পাঁচটি পরীক্ষা করেছেন এবং তারপরে আরও তিনবার এটি করেছিলেন।
- প্রতিটি পদ্ধতির জন্য চারটি ফলাফল গড় হয়েছে।
ফলাফল
যারা আগ্রহী তাদের জন্য আমি প্রথমে ফলাফল এবং নীচের কোডটি উপস্থাপন করব।
ContainsKey পদ্ধতি, আশা ছিল হিসাবে, ধীরতম, তাই আমি যে পদ্ধতি গতি তুলনায় প্রতিটি পদ্ধতির গতি দেব।
- কন্টেনস্কি : 30.654 সেকেন্ড (বেসলাইন)
- পারমাণবিক লং: 29.780 সেকেন্ড (দ্রুত হিসাবে 1.03 গুণ)
- পরীক্ষার জন্য নাল: ২৮.৮০৪ সেকেন্ড (দ্রুত হিসাবে ১.০6 বার)
- ট্র্যাভ : 26.313 সেকেন্ড (1.16 বার দ্রুত)
- পরিবর্তনীয় আইটেম: 25.747 সেকেন্ড (1.19 বার দ্রুত)
উপসংহার
এটি প্রদর্শিত হবে যে কেবলমাত্র পরিবর্তনীয় পদ্ধতি এবং ট্র্যাভ পদ্ধতিটি দ্রুততর দ্রুতগতিতে কেবলমাত্র তারা 10% -রও বেশি পারফরম্যান্সকে উত্সাহ দেয়। তবে থ্রেডিং যদি সমস্যা হয় তবে অ্যাটমিকলং অন্যদের তুলনায় আরও আকর্ষণীয় হতে পারে (আমি সত্যই নিশ্চিত নই)। আমি final
ভেরিয়েবলগুলির সাথে টেস্টফরনলও চালিয়েছি , তবে পার্থক্যটি নগন্য ছিল।
নোট করুন যে আমি বিভিন্ন পরিস্থিতিতে মেমরির ব্যবহারের প্রোফাইল দিইনি। যে কারও কাছ থেকে মিউটেবিল ইনট এবং ট্র্যাভ পদ্ধতিগুলি মেমরির ব্যবহারকে প্রভাবিত করতে পারে তার মধ্যে ভাল অন্তর্দৃষ্টি রয়েছে এমন কারও কাছ থেকে শুনে আমি খুশি হব।
ব্যক্তিগতভাবে, আমি মিউটেবলআইন্ট পদ্ধতিটিকে সবচেয়ে আকর্ষণীয় বলে মনে করি, কারণ এতে কোনও তৃতীয় পক্ষের ক্লাস লোড করার প্রয়োজন হয় না। সুতরাং যদি আমি এটির সাথে সমস্যা না আবিষ্কার করি তবে আমি সম্ভবত এই পথেই যেতে পারি।
কোড
প্রতিটি পদ্ধতি থেকে এখানে গুরুত্বপূর্ণ কোড।
ContainsKey
import java.util.HashMap;
import java.util.Map;
...
Map<String, Integer> freq = new HashMap<String, Integer>();
...
int count = freq.containsKey(word) ? freq.get(word) : 0;
freq.put(word, count + 1);
TestForNull
import java.util.HashMap;
import java.util.Map;
...
Map<String, Integer> freq = new HashMap<String, Integer>();
...
Integer count = freq.get(word);
if (count == null) {
freq.put(word, 1);
}
else {
freq.put(word, count + 1);
}
AtomicLong
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
...
final ConcurrentMap<String, AtomicLong> map =
new ConcurrentHashMap<String, AtomicLong>();
...
map.putIfAbsent(word, new AtomicLong(0));
map.get(word).incrementAndGet();
Trove
import gnu.trove.TObjectIntHashMap;
...
TObjectIntHashMap<String> freq = new TObjectIntHashMap<String>();
...
freq.adjustOrPutValue(word, 1, 1);
MutableInt
import java.util.HashMap;
import java.util.Map;
...
class MutableInt {
int value = 1; // note that we start at 1 since we're counting
public void increment () { ++value; }
public int get () { return value; }
}
...
Map<String, MutableInt> freq = new HashMap<String, MutableInt>();
...
MutableInt count = freq.get(word);
if (count == null) {
freq.put(word, new MutableInt());
}
else {
count.increment();
}