অবজেক্ট পুলিং একটি অবচয় কৌশল আছে?


62

আমি অবজেক্ট পুলিংয়ের ধারণার সাথে খুব পরিচিত এবং আমি সর্বদা এটি যতটা সম্ভব ব্যবহার করার চেষ্টা করি।

অতিরিক্ত হিসাবে আমি সর্বদা ভেবেছিলাম যে অবজেক্ট পুলিং হ'ল আদর্শ নিয়ম হিসাবে আমি দেখেছি যে জাভা নিজেই অন্যান্য ফ্রেমওয়ার্কগুলি যতটা সম্ভব পুলিং ব্যবহার করে।

সম্প্রতি যদিও আমি এমন কিছু পড়েছি যা আমার কাছে সম্পূর্ণ নতুন (এবং পাল্টা-স্বজ্ঞাত?)।

এই পুলিংটি প্রকৃতপক্ষে সাম্প্রতিক অ্যাপ্লিকেশনগুলিতে প্রোগ্রামের কার্যকারিতা আরও খারাপ করে তোলে এবং এর newপরিবর্তে অবজেক্টগুলি ইনস্ট্যান্ট করার পরামর্শ দেওয়া হয় , যেহেতু নতুন জেভিএমগুলিতে কোনও বস্তুর তাত্ক্ষণিক কাজ খুব দ্রুত হয়।

আমি বইটিতে এটি পড়েছি: Java Concurrency in Practice

এখন আমি ভাবতে শুরু করছি যে বইয়ের প্রথম অংশে নতুন উদাহরণ তৈরি করার পরিবর্তে Executorsসেই পুনরায় ব্যবহারের পরামর্শ দেওয়ার পরে আমি এখানে কিছু ভুল করছি Thread

তাহলে আজকাল কি অবজেক্ট পুলিং অবহেলা করা হয়েছে?

উত্তর:


72

এটি একটি সাধারণ কৌশল হিসাবে অবহিত করা হয়েছে, কারণ - যেমন আপনি লক্ষ্য করেছেন - প্রতি জেএম (যেমন মেমরি বরাদ্দ এবং জিসি) স্বল্পজীবী বস্তুর সৃষ্টি এবং ধ্বংস আধুনিক জেভিএমগুলিতে অত্যন্ত সস্তা। সুতরাং আপনার রান-অফ-মিল-অবজেক্টের জন্য একটি হস্ত-লিখিত অবজেক্ট পুল ব্যবহার করা সম্ভবত প্লেইনের চেয়ে ধীর, জটিল এবং আরও ত্রুটি-প্রবণ new*

এটির এখনও এর ব্যবহার রয়েছে, বিশেষ অবজেক্টগুলির জন্য যাদের তৈরি তুলনামূলকভাবে ব্যয়বহুল, যেমন ডিবি / নেটওয়ার্ক সংযোগ, থ্রেড ইত্যাদি is

* একবার আমাকে ক্রলিং জাভা অ্যাপের কর্মক্ষমতা উন্নত করতে হয়েছিল improve তদন্তে লক্ষ লক্ষ বস্তু বরাদ্দ করার জন্য একটি অবজেক্ট পুল ব্যবহার করার প্রয়াস উন্মোচিত হয়েছিল ... এবং যে চালাক লোকটি এটি লিখেছিল সেটি একত্রিত করে বিশ্বব্যাপী তালাটিকে সুরক্ষিত করে তোলার জন্য। প্লেইনটির সাথে প্লেসটি প্রতিস্থাপন করা newঅ্যাপ্লিকেশনটিকে 30 বার দ্রুত করেছে।


1
সুতরাং কীভাবে সিদ্ধান্ত নেওয়া যায় যে কোনও জিনিসের ইনস্ট্যান্টেশন খুব ব্যয়বহুল?
ব্যবহারকারী 10326

3
যদি অবজেক্ট অপারেটিং সিস্টেমের রিসোর্স (থ্রেড, আই / ও, শেয়ার্ড মেমরি ইত্যাদি) গ্রাস করে
কেভিন cline

13
@ ব্যবহারকারী 10326, পরিমাপ অনুসারে :-) যদি আপনার অবজেক্ট তৈরি করতে খুব বেশি সময় লাগে এবং / অথবা এগুলি কিছু বিশেষ, সম্ভাব্য সীমিত, স্মৃতিবিহীন সংস্থানগুলির সাথে যুক্ত থাকে তবে আপনি পুলিং বিবেচনা করতে পারেন।
প্যাটার তারেক

8
@ ব্যবহারকারী 10326, আইএমও 95% এরও বেশি ক্ষেত্রে, উপরোক্ত মানদণ্ডগুলি আপনাকে কোনও অবজেক্ট পুলের প্রয়োজন কিনা তা আগে থেকেই সিদ্ধান্ত নেওয়া সহজ করে তোলে। (তদ্ব্যতীত, পুলের প্রয়োজন প্রায় সব ক্ষেত্রেই আপনি সম্ভবত বিদ্যমান লাইব্রেরি / কাঠামো ব্যবহার করবেন, সম্ভবত আপনার জন্য ইতিমধ্যে অবজেক্ট পুলটি প্রয়োগ করা হয়েছে)) বাকিগুলির জন্য, উদাহরণস্বরূপ অবজেক্টের সৃষ্টি লুকানো এখনও সহজ eg একটি কারখানা, যা আপনি যে কোনও উপায়ে ফিট দেখতে পারা যায় later
প্যাটার তারেক

2
@ পিটার টরোক দ্বারা তৈরি অত্যন্ত গুরুত্বপূর্ণ বিষয়: অনেকগুলি ফ্রেমওয়ার্ক এবং গ্রন্থাগারগুলি আপনার জন্য পুলিং বাস্তবায়ন করে, সর্বদা নিশ্চিত করুন যে আপনি ইতিমধ্যে নিজের প্রয়োগের আগে কোনও পুলের লাইব্রেরি ব্যবহার করছেন না।
hromanko

36

কংক্রিট প্রশ্নের উত্তর: 'অবজেক্টটি কি একটি অবজ্ঞাত কৌশলকে পুলিং করছে?' হল:

না। অবজেক্ট পুলিং নির্দিষ্ট স্থানে ব্যাপকভাবে ব্যবহৃত হয় - থ্রেড পুলিং, ডাটাবেস সংযোগ পুলিং ইত্যাদি in

সাধারণ অবজেক্ট তৈরি কখনও ধীর প্রক্রিয়া হয় নি। পুলিং নিজেই সংস্থান গ্রহণ করে - মেমরি এবং প্রক্রিয়াকরণ শক্তি। যে কোনও অপ্টিমাইজেশন হ'ল ট্রেড অফ।

বিধিটি হ'ল:

অকাল অপটিমাইজেশন খারাপ!

কিন্তু কখন প্রদত্ত অপ্টিমাইজেশন অকাল হয়?

অকাল অপটিমাইজেশন হ'ল কোনও অপ্টিমাইজেশন হ'ল পূর্বে আপনি পুরোপুরি প্রোফাইলিংয়ের মাধ্যমে কোনও বাধা খুঁজে পেয়েছেন


2
প্রকৃতপক্ষে. ওপি বলেছিলেন "আমি সর্বদা এটি যথাসম্ভব ব্যবহার করার চেষ্টা করি" - এই সমস্যা, আইএমও।
নারডেটিনর

@ বরিস, সুতরাং আপনার দ্বিতীয় বাক্য অনুসারে, আমাদের পুলে ডিবি সংযোগ এবং থ্রেডগুলি আপত্তি করা উচিত না যতক্ষণ না আমরা সেগুলি প্রোফাইলের মাধ্যমে বাধা হিসাবে উদঘাটন করি?
পেসারিয়ার

1
@ প্যাক কিছু প্রোফাইল ফলাফলের ধ্রুব পুনরায় মাপার প্রয়োজন হবে না :-)
ডেভিড বুলক

9

আপনি যেখানে আবর্জনা সংগ্রহ সম্পূর্ণরূপে এড়াতে চান সেই পরিস্থিতিতে, আমি মনে করি অবজেক্ট পুলিংই কেবলমাত্র একটি কার্যকর বিকল্প। সুতরাং না, এটি একেবারে অবহেলা কৌশল নয়।


1
এবং আমি যুক্ত করব যে যখনই বস্তুগুলি দীর্ঘস্থায়ী হয় তবে তারা পুরানো প্রজন্মের দিকে চলে যায়, জিসি এড়ানো ভাল ধারণা।
Zan Lynx

8

পরিমাপ করা

এটি সম্পূর্ণরূপে আপনার ব্যবহারের ক্ষেত্রে, আপনার সামগ্রীর আকার, আপনার জেভিএম, আপনার জেভিএম বিকল্পগুলি, আপনি কোন জিসি সক্ষম করেছেন এবং অন্যান্য বিষয়গুলির সম্পূর্ণ হোস্টের উপর নির্ভর করে।

সংক্ষেপে: এটি আগে পরিমাপ করুন এবং পরে এটি পরিমাপ করুন। ধরে নিই যে আপনি কোনও অবজেক্ট পুলিং ফ্রেমওয়ার্ক ব্যবহার করছেন (যেমন অ্যাপাচি থেকে) তারপরে বাস্তবায়নগুলির মধ্যে অদলবদল করা খুব বেশি বেদনাদায়ক হওয়া উচিত নয়।

অতিরিক্ত পারফরম্যান্স টেস্টিং টিপ - জেভিএমকে প্রথমে কিছুটা গরম হতে দিন, চলমান জেভিএমের উপর পরীক্ষা চালাতে বেশ কয়েকবার চালাতে দিন, এটি অন্যরকম আচরণ করতে পারে।


3
"প্রথমে জেভিএমকে কিছুটা গরম হতে দিন," - আমার মনে আছে যখন "ওয়ার্মআপ আপ" হওয়ার একমাত্র জিনিসটি ছিল মনিটর। ও, নতুন সবকিছু আবার পুরানো।
kylben

আমার একমাত্র জিনিসটি গরম করা দরকার কফি!
বিভ্রান্ত

@ মারিজন, আপনি কীভাবে এটি "উত্তপ্ত" হতে দেন?
পেসারিয়ার

পুরো ব্যাখ্যার জন্য জেএমএইচ ফ্রেমওয়ার্ক দেখুন ( ওপেনজেডক.জেভা.এন.এ. / প্রকল্পগুলি / কোড / টোলস / জেএমএইচ ) তবে মূলত আপনি জেভিএমকে আপনার কোড জেআইটি-তে একটি সুযোগ দিতে হবে, আপনার বেঞ্চমার্কের আগে জিসি চালাবেন ইত্যাদি।
মার্টিজন ভার্গবার্গ

8

এই পুলিংটি প্রকৃতপক্ষে সাম্প্রতিক অ্যাপ্লিকেশনগুলিতে প্রোগ্রামের কার্যকারিতা আরও খারাপ করে তোলে এবং এর পরিবর্তে নতুন অবজেক্টগুলি ইনস্ট্যান্ট করার পরামর্শ দেওয়া হয়, যেহেতু নতুন জেভিএমগুলিতে কোনও বস্তুর ইনস্ট্যান্টেশন সত্যই দ্রুত হয়।

প্রসঙ্গে নির্ভর করে।


1
দুর্দান্ত উত্তর, এবং কোজেন্ট। আমি যুক্ত করেছি (সম্ভবত, সম্ভবত একটি তারকা হিসাবে?) যে "24 বাইটস" দাবিটি 4-বাইট ফ্লোট (16 বাইট) এর 4 টি উদাহরণ, এবং 4 টি বাইট অবজেক্ট রেফারেন্সের জন্য, 4 টি বাইটকে লক রেফারেন্সের জন্য উল্লেখ করে। এটি হ'ল ওভারহেড আপনার নকশাটি মুছে ফেলে।
স্ট্রিকলি

5

আমি জানি না যে এখানে কোনও পরিবর্তনশীল প্রবণতা রয়েছে কিনা তবে এটি অবশ্যই নির্ভর করবে এটি নির্ভর করে । যদি আপনার জাভা শ্রেণি যদি কোনও বাহ্যিক সংস্থান যেমন একটি আরএমআই সংযোগ বা কোনও রিসোর্স ফাইল লোড করা ইত্যাদি পরিচালনা করে থাকে - তবে অবশ্যই অবজেক্ট ইনস্ট্যান্টেশনের জন্য ব্যয়গুলি এখনও বেশি হতে পারে (যদিও সেই সংস্থানগুলি আপনার জন্য ইতিমধ্যে তৈরি করা যেতে পারে!)। একটি সাধারণ অনুশীলন হিসাবে আমি বইটির সাথে একমত হই।


ভাল এখন আমি জানি না। এই ক্ষেত্রে এমনকি আপনি যা বর্ণনা করেন (এটি পড়ার আগে) আমি পুলিংটি সংজ্ঞায়িতভাবে ব্যবহার করব, আমার ওভারহেডও থাকবে .1) পুলিংটি পরিচালনা করার জন্য নতুন কন্সট্রাক্টস ২) প্রাপ্তি / অবমুক্তকরণের জন্য সিঙ্ক্রোনাইজেশন পুল 3 থেকে) পুল বজায় রাখা ইত্যাদি So তাই আমি এখন ভাবছি যে সম্ভবত এটির কোনও ব্যবহারের ঘটনা নেই eg উদাহরণস্বরূপ সার্ভারের সাথে সংযোগ স্থাপনের জন্য প্রতিবার একটি নতুন খোলার পরিবর্তে সকেট ক্যাচ করা। এবং এই কেসটি নেটওয়ার্কের কারণে
বিলম্ব

@ user10326 হ্যাঁ ঠিক আছে। আমি ইনস্ট্যান্টেশন ওভারহেডের অংশ হিসাবে একটি সকেট খোলার বিষয়টি দেখতে পাচ্ছি, যদি এটির কাজটি ক্লাসের কাজ করে এবং এটি নির্মাত্রে শুরু করা আবশ্যক তবে ল্যাটেন্সী এবং আইও এর প্রভাবগুলি যা আপনার সাথে সম্পর্কিত।
জেরেমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.