আমি সম্প্রতি স্ট্যাকওভারফ্লোতে একটি প্রশ্ন উত্থাপন করেছি, তার পরে উত্তরটি পেয়েছি। প্রাথমিক প্রশ্নটি ছিল ম্বেটেক্স বা আবর্জনা সংগ্রহ ছাড়া অন্য কোন পদ্ধতিগুলি আমার বহু-থ্রেড জাভা প্রোগ্রামকে ধীর করতে পারে?
আমি আমার ভয়াবহতার মধ্যে আবিষ্কার করেছি যে হ্যাশম্যাপটি জেডিকে 1.6 এবং জেডিকে 1.7 এর মধ্যে পরিবর্তিত হয়েছে। এটিতে এখন কোডের একটি ব্লক রয়েছে যা হ্যাশম্যাপগুলি তৈরি করে সমস্ত থ্রেডকে সিঙ্ক্রোনাইজ করে।
JDK1.7.0_10 এ কোডের লাইন
/**A randomizing value associated with this instance that is applied to hash code of keys to make hash collisions harder to find. */
transient final int hashSeed = sun.misc.Hashing.randomHashSeed(this);
যার কল শেষ হয়
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
অন্যান্য জেডিকে-তে অনুসন্ধান করে, আমি দেখতে পাচ্ছি যে এটি জেডিকে 1.5.0_22 বা জেডিকে 1.6.0_26 তে উপস্থিত নেই।
আমার কোডের উপর প্রভাব বিশাল। এটি এটিকে এমন করে তোলে যাতে আমি যখন threads৪ টি থ্রেডে রান করি তখন আমি 1 থ্রেডে চালিত হওয়ার চেয়ে কম পারফরম্যান্স পাই। একটি জেস্ট্যাক দেখায় যে বেশিরভাগ থ্রেডগুলি তাদের বেশিরভাগ সময় র্যান্ডমের সেই লুপটিতে কাটানোর জন্য ব্যয় করে।
সুতরাং আমার কাছে কিছু বিকল্প রয়েছে বলে মনে হচ্ছে:
- আমার কোডটি পুনরায় লিখুন যাতে আমি হ্যাশম্যাপ ব্যবহার না করি তবে অনুরূপ কিছু ব্যবহার করি
- আরটি.জার দিয়ে কোনওভাবে গোলমাল করুন এবং এর ভিতরে হ্যাশম্যাপটি প্রতিস্থাপন করুন
- শ্রেণি পাথটি একরকম ছড়িয়ে পড়ে, সুতরাং প্রতিটি থ্রেড হ্যাশম্যাপের নিজস্ব সংস্করণ পায়
আমি এই পাথগুলির যে কোনওটি শুরু করার আগে (সকলেই খুব সময় সাশ্রয়ী এবং সম্ভাব্য উচ্চ প্রভাব দেখায়), আমি ভাবলাম যে আমি কোনও স্পষ্ট কৌশলটি মিস করেছি কিনা। আপনারা কেউ ওভারফ্লো লোককে পরামর্শ দিতে পারেন যে কোনটি উত্তম পথ বা সম্ভবত একটি নতুন ধারণা চিহ্নিত করতে পারে।
সাহায্যের জন্য ধন্যবাদ