আমাদের জাভাতে অবজেক্ট তৈরি করা এড়ানো উচিত?


242

আমাকে একজন সহকর্মী জানিয়েছিলেন যে জাভা অবজেক্ট তৈরি করা আপনার পক্ষে সবচেয়ে ব্যয়বহুল অপারেশন। সুতরাং আমি যতটা সম্ভব কম কয়েকটি অবজেক্ট তৈরির সিদ্ধান্তে পৌঁছাতে পারি।

এটি কিছুটা অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ের উদ্দেশ্যকে পরাস্ত করে বলে মনে হচ্ছে। আমরা যদি অবজেক্ট তৈরি না করে থাকি তবে আমরা কেবলমাত্র একটি দীর্ঘ শ্রেণির সি স্টাইল লিখছি, অপ্টিমাইজেশনের জন্য?


39
"জাভা অবজেক্ট তৈরি করা সবচেয়ে ব্যয়বহুল ক্রিয়া যা আপনি করতে পারেন" । সেই দাবির উত্স ভাগ করে নিচ্ছেন?
স্যাঙ্গো

92
এবং - সবচেয়ে ব্যয়বহুল অপারেশন কি তুলনায়? পাইকে 900 ডিজিটের সাথে গণনা করার তুলনায় বা কোনও ইনট বাড়ানোর তুলনায়?
জেসনক

4
তারা কি সেই নির্দিষ্ট অবজেক্ট তৈরির একটি বিশেষ অংশের কথা বলছে? আমি ভাবছি অ্যাপল কীভাবে টেবিলভিউসেলগুলির জন্য একটি সারি ব্যবহার করে। সম্ভবত আপনার সহকর্মী নির্দিষ্ট বস্তুর সাথে যুক্ত কিছু ওভারহেডের কারণে কয়েকটি অবজেক্ট তৈরি করার এবং সেগুলি পুনরায় ব্যবহার করার পরামর্শ দিচ্ছিলেন? তারা কেন এমন দাবি করল তা কেবল খালি দেখার চেষ্টা করা হচ্ছে।
টাইলার ডিউইট

3
আমি প্রোগ্রামিংয়ের বিষয়ে শুনেছি এটি সবচেয়ে মজার বিষয়গুলির মধ্যে একটি))
মের্ট অ্যাকাকায়া

22
পাটিগণিতও বেশ ব্যয়বহুল; আমাদের গণনা এড়ানো উচিত, ওহ, এবং একটি জেভিএম শুরু করা সত্যিই ব্যয়বহুল তাই আমাদের কোনও জেভিএম :-) শুরু করা উচিত নয়।
জেমস অ্যান্ডারসন

উত্তর:


478

তারা কী বলছে তা আপনার সহকর্মীর কোনও ধারণা নেই।

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

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

সবকিছুই একটি অবজেক্ট (ব্যতীত primitives)

আদিমগুলি ( int, long, double, ইত্যাদি) ব্যতীত অন্য সমস্ত কিছুই জাভাতে অবজেক্ট। জাভাতে অবজেক্ট সৃষ্টি এড়ানোর কোনও উপায় নেই।

জাভাতে মেমরি বরাদ্দ কৌশলগুলির কারণে অবজেক্ট তৈরি বেশিরভাগ ক্ষেত্রে সি ++ এর চেয়ে দ্রুত এবং জেভিএমের সমস্ত কিছুর তুলনায় সমস্ত ব্যবহারিক উদ্দেশ্যে "মুক্ত" হিসাবে বিবেচনা করা যেতে পারে

1990 এর দশকের শেষের দিকে যেমন 2000 এর দশকের গোড়ার দিকে জেভিএম বাস্তবায়নগুলি বস্তুর আসল বরাদ্দে কিছু কার্য সম্পাদন করেছিল। এটি কমপক্ষে ২০০৫ সাল থেকে হয়নি।

আপনি সুর যদি -Xmsসব স্মৃতি আপনি আপনার আবেদন সঠিকভাবে চালানোর জন্য প্রয়োজন সমর্থন করার জন্য, জিসি চালানো এবং আধুনিক জিসি বাস্তবায়নের আবর্জনা অধিকাংশ কুড়ান, সংক্ষিপ্ত বাস করত প্রোগ্রাম কখনোই জিসি এ সব may করতে হবে না হতে পারে।

এটি খালি জায়গার চেষ্টা করে এবং সর্বাধিক করে তোলে না, এটি যাইহোক একটি লাল রঙের হেরিং, এটি রানটাইমের কার্যকারিতা সর্বাধিক করে তোলে। যদি এর অর্থ জেভিএম হিপগুলি প্রায় সবসময় 100% বরাদ্দ থাকে, তবে তা হয়ে উঠুন। ফ্রি জেভিএম হিপ মেমরি আপনাকে যাইহোক সেখানে বসে কেবল কিছু দেয় না।

একটি ভুল ধারণা রয়েছে যে জিসি দরকারী পদ্ধতিতে সিস্টেমের বাকী অংশগুলিতে মেমরি ফিরিয়ে দেবে, এটি সম্পূর্ণ মিথ্যা!

জেভিএম হিপগুলি বৃদ্ধি এবং সঙ্কুচিত হয় না যাতে জেভিএম হিপের বাকী সিস্টেমটি ফ্রি মেমরির দ্বারা ইতিবাচকভাবে প্রভাবিত হয় । -Xmsশুরুতে যা নির্দিষ্ট করা হয়েছে তার সবই বরাদ্দ করে দেয় এবং এর তাত্পর্যপূর্ণ যা জেভিএম এর উদাহরণটি পুরোপুরি ছাড়ার আগ পর্যন্ত অন্য কোনও ওএস প্রসেসের সাথে ভাগ করে নেওয়ার জন্য সেই মেমরিটির কোনওটিই ওএস-এ ফিরে আসবে না। -Xms=1GB -Xmx=1GBপ্রকৃত যে কোনও সময়ে আসলে কতগুলি অবজেক্ট তৈরি করা যায় তা বিবেচনা না করে 1 জিবি র‌্যাম বরাদ্দ করে। কিছু সেটিংস রয়েছে যা হিপ মেমরির শতাংশকে প্রকাশের অনুমতি দেয় তবে সমস্ত ব্যবহারিক উদ্দেশ্যে জেভিএম কখনও কখনও এই মেমরির যথেষ্ট পরিমাণে প্রকাশ করতে সক্ষম হয় নাসুতরাং অন্য কোনও প্রক্রিয়া এই মেমোরিটিকে পুনরায় দাবি করতে পারে না, সুতরাং JVM হিপটি ফ্রি হয়ে যাওয়ার ফলে সিস্টেমের বাকি অংশগুলি উপকৃত হয় না। এর জন্য একটি আরএফই 29-NOV-2006 "স্বীকৃত" হয়েছিল তবে এটি সম্পর্কে এখনও কিছুই করা হয়নি। এটি আচরণ কর্তৃপক্ষের যে কেউ উদ্বেগ হিসাবে বিবেচিত হয় না।

একটি ভুল ধারণা রয়েছে যে অনেক ছোট ছোট জীবিত অবজেক্ট তৈরি করা জেভিএমকে দীর্ঘ সময়ের জন্য বিরতি দেয়, এটি এখন মিথ্যাও is

বর্তমান জিসি অ্যালগরিদমগুলি আসলে অনেকগুলি ছোট ছোট বস্তু তৈরি করার জন্য অনুকূলিত হয় যা স্বল্পস্থায়ী হয়, যা প্রতিটি প্রোগ্রামে জাভা অবজেক্টের জন্য মূলত 99% হিউরিস্টিক। অবজেক্ট পুলিংয়ের প্রচেষ্টা আসলে বেশিরভাগ ক্ষেত্রে জেভিএমকে আরও খারাপ সম্পাদন করে।

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

আধুনিক জিসি অ্যালগরিদমগুলির এই সমস্যাটি নেই কারণ তারা একটি সময়সূচীতে ডিএলোকট করে না, নির্দিষ্ট প্রজন্মের মধ্যে যখন ফ্রি মেমরির প্রয়োজন হয় তখন তারা ডিলোকোট করে। গাদা যদি যথেষ্ট পরিমাণে বড় হয়, তবে কোনও বিরাম ঘটাতে কোনও দীর্ঘস্থায়ী ঘটনা ঘটতে পারে না।

অবজেক্ট ওরিয়েন্টেড ডায়নামিক ভাষাগুলি গন সংবেদনশীল পরীক্ষায় আজকাল সি মারছে।


274
+1: "আপনার সবচেয়ে ব্যয়বহুল অপারেশনটি তাদের শুনবে ..."। সেরা আমি কিছু সময়ের জন্য শুনেছি।
rjnilsson

21
@ ডেড এমজি, এমনকি জমে জিসি ওভারহেড থাকা সত্ত্বেও, জাভা সি ++ এর চেয়ে দ্রুত হতে পারে (উদাহরণস্বরূপ, হিপ সংযোগের কারণে, কিছু ডেটা কাঠামোর জন্য ক্যাশে মিস করা যায় না)।
এসকে-যুক্তি

13
@ এসকে-যুক্তি: জিসি যেহেতু অ-সংঘবদ্ধ, তাই বাস্তবে এটি প্রমাণ করা চূড়ান্তভাবে কঠিন। ক্যাশে মিস করা কমানোর ক্ষেত্রে, এটি করা শক্ত যখন প্রতিটি বস্তুর অবশ্যই অন্য দিকনির্দেশ হতে হবে, ক্যাশে স্থান নষ্ট করা এবং মৃত্যুর সময় বাড়ানো। তবে আমি যুক্তি দিচ্ছি যে কেবলমাত্র সি ++ তে অবজেক্ট পুল বা মেমরির ক্ষেত্রের মতো উপযুক্ত বরাদ্দকারী ব্যবহার করে আপনি সহজেই ময়লা ফেলতে পারবেন বা আবর্জনা সংগ্রাহকের কার্য সম্পাদন করতে পারবেন। উদাহরণস্বরূপ, আপনি স্মৃতিচারণের ক্লাস লিখতে পারেন যা _allocaএমোরিটাইজডের চেয়ে দ্রুত সম্পাদন করবে ।
ডেডএমজি

33
অবজেক্ট তৈরি করা এখন আগের তুলনায় সস্তা। যদিও এটি নিখরচায় নয়। যে কেউ আপনাকে মিথ্যা বলছে। এবং সি এর প্রহারে ওও ভাষাগুলি সম্পর্কে লিঙ্কটি এমন কোনও ব্যক্তির কাছে অতিরঞ্জিত প্রতিক্রিয়া যা সত্যই শেখার চেষ্টা করছে।
জেসনক

17
এটি এই ধরণের উত্তরগুলির কারণেই আমরা ক্রেপি কোড সহ শেষ করি। সঠিক উত্তরটি জাভাতে একটি অবজেক্ট তৈরি করা হচ্ছে জাভা অবজেক্ট তৈরি করা এবং এটি আরম্ভ করা। প্রথম অংশ সস্তা হয়, তাহলে দ্বিতীয়টি করতে খুব ব্যয়বহুল হবে। newহটস্পট স্থানে কীওয়ার্ডটি ব্যবহার করার আগে লোকেরা সর্বদা কনস্ট্রাক্টরগুলিতে কী ঘটে তা দেখতে হবে । আমি দেখেছি মানুষ ব্যবহার new ImageIcon(Image)মধ্যে paint()সুইং বস্তুর পদ্ধতি, যা প্রশংসনীয় ব্যয়বহুল এবং সমগ্র UI 'তে সুপার মন্দ উপার্জন করা হয়। সুতরাং এটি কোনও কালো এবং সাদা উত্তর নয়, আপনি newকোথাও ব্যবহার করার আগে ভাবেন ।
কিউয়ার্টজগুয়ে

94

নীচের লাইন: শর্টকাটগুলি অবজেক্ট তৈরি করার জন্য আপনার নকশাকে আপোষ করবেন না। অযথা অবজেক্ট তৈরি করা এড়াবেন না। যদি বুদ্ধিমান হয় তবে অপ্রয়োজনীয় ক্রিয়াকলাপগুলি এড়াতে ডিজাইন করুন (কোনও ধরণের)।

বেশিরভাগ উত্তরের বিপরীতে - হ্যাঁ, অবজেক্ট বরাদ্দকরণের কোনও মূল্য যুক্ত হয়। এটি একটি স্বল্প ব্যয়, তবে আপনার অপ্রয়োজনীয় জিনিস তৈরি করা এড়ানো উচিত। আপনার কোডটিতে অপ্রয়োজনীয় কিছু এড়ানো উচিত ame বৃহত্তর অবজেক্ট গ্রাফগুলি জিসিকে ধীর করে দেয়, আরও সম্ভবত কার্যকর করার সময়গুলি বোঝায় যে আপনি সম্ভবত আরও পদ্ধতি কল করতে চলেছেন, আরও সিপিইউ ক্যাশে মিস করবেন এবং কম র‌্যাম ক্ষেত্রে আপনার প্রসেসের ডিস্কে অদলবদলের সম্ভাবনা বাড়িয়ে তুলবে।

এটি সম্পর্কে একটি প্রান্ত কেস হিসাবে কাউকে rantsণ দেওয়ার আগে - আমার কাছে এমন অ্যাপ্লিকেশন রয়েছে যা অনুকূলিতকরণের আগে, process 50 সারি ডেটা প্রক্রিয়া করার জন্য 20 + এমবি অবজেক্ট তৈরি করেছিল। এটি টেস্টিংয়ের ক্ষেত্রে ঠিক আছে, যতক্ষণ না আপনি এক মিনিট পর্যন্ত 100 টি অনুরোধের স্কেল করেন এবং হঠাৎ আপনি প্রতি মিনিটে 2 জিবি ডেটা তৈরি করেন না। আপনি যদি 20 টি প্রশ্ন / সেকেন্ড করতে চান তবে আপনি 400 এমবি অবজেক্ট তৈরি করছেন এবং তারপরে ফেলে দিচ্ছেন। 20 রেক্স / সেকেন্ড একটি শালীন সার্ভারের জন্য খুব ছোট।


7
আমি একটি উদাহরণ যুক্ত করতে পারি: কিছু ক্ষেত্রে কোডের স্বচ্ছতার ক্ষেত্রে এটি সত্যই কোনও পার্থক্য করে না তবে কার্য সম্পাদনে আরও কম বা বেশি পার্থক্য আনতে পারে: উদাহরণস্বরূপ, স্ট্রিমগুলি পড়ার সময়, এমন কিছু ব্যবহার করা অস্বাভাবিক কিছু নয় while(something) { byte[] buffer = new byte[10240]; ... readIntoBuffer(buffer); ...যা হতে পারে যেমন তুলনায় অপব্যয় করা byte[] buffer = new byte[10240]; while(something) { ... readIntoBuffer(buffer); ...
জিমিবি

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

1
কি দারুন! 20+ এমবি 50 সারি ডেটা প্রক্রিয়া করবে? মনে হচ্ছে পাগল। যাই হোক না কেন, সেই জিনিসগুলি কি দীর্ঘকালীন? কারণ এটিই কেসিসি যে জিসির পক্ষে গুরুত্বপূর্ণ। অন্যদিকে যদি আপনি কেবল মেমরির প্রয়োজনীয়তাগুলি নিয়ে আলোচনা করছেন তবে এটি আবর্জনা সংগ্রহ বা অবজেক্ট তৈরির দক্ষতার সাথে সম্পর্কিত নয় ...
অ্যান্ড্রেস এফ।

1
অবজেক্টগুলি স্বল্পস্থায়ী হয় (সাধারণ ক্ষেত্রে ০.৫ সেকেন্ডের কম)। সেই পরিমাণ আবর্জনা এখনও কর্মক্ষমতাকে প্রভাবিত করে।
জেসনক

2
বাস্তবে অবিচল থাকার জন্য আপনাকে ধন্যবাদ, যে কেউ উদাসীন আর্কিটেকচারের প্রভাব নিয়ে বেঁচে থাকে সে খুব বেশি সম্পর্ক করতে পারে।
জেএম বেকার

60

প্রকৃতপক্ষে, জাভা ভাষা (বা অন্য কোনও পরিচালিত ভাষা) মেমরি পরিচালনার কৌশলগুলির কারণে, অবজেক্টের সৃষ্টি তরুণ প্রজন্মের নামক মেমরির একটি ব্লকে একটি পয়েন্টার বাড়ানোর চেয়ে কিছুটা কম। এটি সি এর চেয়ে অনেক দ্রুত, যেখানে নিখরচায় মেমরির জন্য অনুসন্ধান করতে হবে।

খরচের অন্যান্য অংশটি হ'ল অবজেক্ট ধ্বংস, তবে সি এর সাথে তুলনা করা শক্ত a সংগ্রহের ব্যয় দীর্ঘমেয়াদী সাশ্রয়ীকৃত বস্তুর পরিমাণের উপর ভিত্তি করে তবে সংগ্রহের ফ্রিকোয়েন্সি তৈরি হওয়া সামগ্রীর পরিমাণের উপর ভিত্তি করে ... শেষ, এটি সি-স্টাইলের মেমরি পরিচালনার চেয়ে এখনও অনেক দ্রুত।


7
+1 যদিও আবর্জনা সংগ্রহকারী "ঠিক কাজ করে", প্রতিটি জাভা প্রোগ্রামারের প্রজন্মের আবর্জনা সংগ্রহকারী সম্পর্কে শিখতে হবে।
বেনজাদো

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

4
একটি পরবর্তী ধাপে পালাবার বিশ্লেষণের জন্য "বরাদ্দ করা" থেকে বিশুদ্ধরূপে রেজিস্টার ছোট বস্তুর জন্য মেমরি (উদাহরণস্বরূপ একটি হল Pointবস্তুর 2 সাধারণ কাজের রেজিস্টার মাপসই পারে)।
জোচিম সউর

6
@ জোয়াচিম সাউর: হটস্পট ভিএম এর নতুন বাস্তবায়নে এই ধরনের কাজ করা হয়। একে স্কেলার রিপ্লেসমেন্ট বলা হয়।
someguy

1
@ সোমেগুয়ে: আমি এটি সম্পর্কে পরের জিনিস হিসাবে কিছু সময় আগে পড়েছি, তবে এটি ইতিমধ্যে সম্পন্ন হয়েছে কিনা তা পরীক্ষা করার জন্য অনুসরণ করে নি। এটি ইতিমধ্যে শুনতে আমাদের কাছে দুর্দান্ত খবর।
জোছিম সউর

38

অন্যান্য পোস্টারগুলি যথাযথভাবে উল্লেখ করেছে যে জাভাতে অবজেক্ট তৈরি করা অত্যন্ত দ্রুত এবং আপনার কোনও সাধারণ জাভা অ্যাপ্লিকেশনটিতে সাধারণত এটি নিয়ে উদ্বিগ্ন হওয়া উচিত নয়।

আছে খুব বিশেষ পরিস্থিতিতে একটি দম্পতি কোথায় হয় একটি ভাল ধারণা বস্তু সৃষ্টি এড়ানো।

  • আপনি যখন কোনও বিলম্ব-সংবেদনশীল অ্যাপ্লিকেশন লিখছেন এবং জিসি বিরতি এড়াতে চান। আপনি যত বেশি অবজেক্ট তৈরি করেন, তত বেশি জিসি ঘটে এবং বিরতি দেওয়ার সম্ভাবনা তত বেশি। গেমস, কিছু মিডিয়া অ্যাপ্লিকেশন, রোবোটিক নিয়ন্ত্রণ, উচ্চ-ফ্রিকোয়েন্সি ট্রেডিং ইত্যাদির জন্য প্রাসঙ্গিকের জন্য এটি একটি বৈধ বিবেচনা হতে পারে সমাধানটি হ'ল আপনার সামনে থাকা সমস্ত অবজেক্ট / অ্যারেগুলি প্রাক-বরাদ্দ করা এবং সেগুলি পুনরায় ব্যবহার করুন। এমন গ্রন্থাগার রয়েছে যা এই ধরণের ক্ষমতা সরবরাহে বিশেষী , যেমন জাভোলিউশন । তবে তর্কসাপেক্ষভাবে, আপনি যদি কম বিলম্বের বিষয়ে সত্যই চিন্তা করেন তবে আপনার জাভা বা সি-র পরিবর্তে সি / সি ++ / এসেম্বলার ব্যবহার করা উচিত #
  • বক্সযুক্ত আদিম (ডাবল, পূর্ণসংখ্যা ইত্যাদি) এড়ানো নির্দিষ্ট পরিস্থিতিতে খুব উপকারী মাইক্রো-অপ্টিমাইজেশন হতে পারে। যেহেতু আনবক্সড আদিম (ডাবল, ইন্ট ইত্যাদি) প্রতি-বস্তুর ওভারহেড এড়ানো হয় তাই তারা সংখ্যাবৃত্তিক প্রসেসিংয়ের মতো সিপিইউ নিবিড় কাজ করে সাধারণত: আদিম অ্যারেগুলি জাভাতে খুব ভাল সম্পাদন করে তাই আপনি এগুলি আপনার সংখ্যা ক্র্যাঞ্চিংয়ের পরিবর্তে ব্যবহার করতে চান অন্য কোনও ধরণের অবজেক্ট
  • ইন সীমাবদ্ধ মেমরির পরিস্থিতিতে তোমাদের (সক্রিয়) সংখ্যা কমানোর জন্য নির্মিত বস্তু চান যেহেতু প্রতিটি বস্তু একটি ছোট ওভারহেড (জেভিএম বাস্তবায়ন উপর নির্ভর করে সাধারণত 8-16 বাইটস) বহন করে। এ জাতীয় পরিস্থিতিতে আপনার সংখ্যক ছোট ছোট বস্তুর চেয়ে আপনার ডেটা সঞ্চয় করার জন্য অল্প সংখ্যক বৃহত অবজেক্ট বা অ্যারে পছন্দ করা উচিত।

3
এটি লক্ষণীয় যে পালানোর বিশ্লেষণটি স্বল্পজীবী
রিচার্ড টিংল

1
@ রিচার্ড: দুর্দান্ত পয়েন্ট - এস্কেপ বিশ্লেষণ কিছু খুব ভাল অপটিমাইজেশন সরবরাহ করে। আপনাকে যদিও এর উপর নির্ভর করার বিষয়ে সতর্কতা অবলম্বন করতে হবে: সমস্ত জাভা বাস্তবায়ন এবং সমস্ত পরিস্থিতিতে এটির নিশ্চয়তা নেই। সুতরাং আপনার নিশ্চিত হওয়ার জন্য আপনাকে প্রায়শই বেঞ্চমার্কের প্রয়োজন।
মাইকেরা

2
এছাড়াও, 100% সঠিক অব্যাহতি বিশ্লেষণ থামানো সমস্যার সমতুল্য। জটিল পরিস্থিতিতে পালানোর বিশ্লেষণের উপর নির্ভর করবেন না, কারণ এটি কমপক্ষে কিছু সময় ভুল উত্তর দেয় give
জুলাই

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

17

আপনার সহকর্মী যা বলছে তাতে সত্যের কর্নেল রয়েছে। আমি সসম্ভ্রমে সুপারিশ বস্তুর সঙ্গে সমস্যা সৃষ্টি আসলে আবর্জনা হয় সংগ্রহে । সি ++ এ প্রোগ্রামার সঠিকভাবে নিয়ন্ত্রণ করতে পারে কীভাবে মেমোরিটি হ্রাস করা হয়। প্রোগ্রামটি যতক্ষণ তার পছন্দ হিসাবে কম বা সংক্ষিপ্ত হিসাবে ক্রড জমা করতে পারে। আরও, সি ++ প্রোগ্রাম ক্রুডটি তৈরি করেছে তার চেয়ে আলাদা থ্রেড ব্যবহার করে ফেলে দিতে পারে। সুতরাং বর্তমানে কাজ করা থ্রেডটি পরিষ্কার করার জন্য কখনও থামতে হবে না।

বিপরীতে, জাভা ভার্চুয়াল মেশিন (জেভিএম) পর্যায়ক্রমে অব্যবহৃত মেমরির দাবিতে আপনার কোডটি বন্ধ করে দেয়। বেশিরভাগ জাভা বিকাশকারীরা কখনই এই বিরতি লক্ষ্য করে না, কারণ এটি সাধারণত বিরল এবং খুব ছোট। আপনি যত বেশি ক্রুড জমা করেন বা আপনার জেভিএম তত বেশি সংকুচিত হয়, ততবার এই বিরতিগুলি ঘন ঘন হয়। তোমার মত সরঞ্জাম ব্যবহার করতে পারেন VisualVM এই প্রক্রিয়া ঠাহর করতে।

জাভার সাম্প্রতিক সংস্করণগুলিতে, আবর্জনা সংগ্রহ (জিসি) অ্যালগরিদম টিউন করা যেতে পারে । একটি সাধারণ নিয়ম হিসাবে, আপনি যে বিরতিগুলি কমিয়ে দিতে চান, ভার্চুয়াল মেশিনের ওভারহেড তত বেশি ব্যয়বহুল (যেমন সিপিইউ এবং মেমরি জিসি প্রক্রিয়া সমন্বয় করতে ব্যয় করেছে)।

এই বিষয়টি কখন হতে পারে? যে কোনও সময় আপনি সামঞ্জস্যপূর্ণ সাব-মিলিসেকেন্ড প্রতিক্রিয়া হারগুলি সম্পর্কে যত্নবান হন, আপনি জিসি সম্পর্কে যত্ন নেবেন। জাভাতে লেখা স্বয়ংক্রিয় ট্রেডিং সিস্টেমগুলি বিরতি হ্রাস করার জন্য ভারী JVM টিউন করে। অন্যথায় জাভা লিখতে হবে এমন সংস্থাগুলি এমন পরিস্থিতিতে যেখানে সিস্টেমে সর্বদা উচ্চ প্রতিক্রিয়াশীল থাকতে হয় in

রেকর্ডের জন্য, আমি না সাধারণ বস্তুর পরিহার ক্ষমা! অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে ডিফল্ট। জিসি আপনার পথে চলে আসে কেবল তখনই এই পদ্ধতির সামঞ্জস্য করুন এবং তারপরে কেবল JVM টিউন করার চেষ্টা করার পরে কম সময়ের জন্য বিরতি দিন। জাভা পারফরম্যান্স টিউনিংয়ের একটি ভাল বই হল চার্লি হান্ট এবং বিনু জন দ্বারা রচনা জাভা পারফরম্যান্স


10
"বিশ্ব বন্ধ করুন" এর চেয়ে বেশিরভাগ আধুনিক জেভিএমের সমর্থন জঞ্জাল সংগ্রহের অ্যালগরিদমকে আরও ভাল সমর্থন করে। আবর্জনা সংগ্রহ করতে ব্যয় করা মোড়কযুক্ত সময়টি প্রায়শই ম্যালোক / ফ্রি কল করতে ব্যয় হয় তার চেয়ে কম হয়। এছাড়াও কি সি ++ মেমরি পরিচালনা পৃথক থ্রেডে চালিত হয়?

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

2
@ থরবজরন রাভানএন্ডারসেন: সত্যি? আপনি কি আসলেই বিরতি- কম জিসি বোঝাচ্ছেন বা আপনার অর্থ "সাধারণত-সমান্তরাল-তবে-কখনও-কখনও-ক্ষুদ্র-বিট-বিরাম" জিসি হয়? আমি বুঝতে পারি না কীভাবে জিসি কখনই কোনও প্রোগ্রাম থামিয়ে দিতে পারে না, এবং তবুও একই সাথে অবজেক্টগুলিকে একই সাথে স্থানান্তরিত করতে পারে ... মনে হয়, এটি বেশ আক্ষরিক, আমার পক্ষে অসম্ভব ...
মেহরদাদ

2
@ থরবজুরনআরএনএন্ডারসন: কীভাবে এটি "বিশ্বকে থামাতে" পারে তবে কখনই "জেভিএমকে থামায়" না? এটি কোনও অর্থ দেয় না ...
মেহরদাদ

2
@ থরবজরন রাভানএন্ডারসন: না আমি সত্যিই তা করি না; আমি ঠিক বুঝতে পারছি না তুমি কি বলছ। হয় জিসি কখনও কখনও প্রোগ্রামটি বিরতি দেয়, এক্ষেত্রে এটি হয় - সংজ্ঞা অনুসারে - "বিরতিহীন" নয়, বা এটি প্রোগ্রামটিকে কখনও বিরতি দেয় না (সুতরাং এটি "বিরতিহীন"), এক্ষেত্রে আমি বুঝতে পারি না যে কীভাবে আপনার "এটি পৃথিবী থামিয়ে দেয় যখন এটি ধরে রাখতে পারে না" বিবৃতিটির সাথে মিলে যায়, যেহেতু এর দ্বারা বোঝা যাচ্ছে যে জিসিটি চলাকালীন প্রোগ্রামটি বিরতি দিয়েছিল। কোনটি কেস (এটি কি বিরতিহীন বা না?) এবং কীভাবে এটি সম্ভব?
মেহরদাদ

11

ওভারহেডের কারণে জাভাতে অনেকগুলি অবজেক্ট তৈরি করা থেকে নিরুৎসাহিত হতে পারে এমন একটি ঘটনা রয়েছে - অ্যান্ড্রয়েড প্ল্যাটফর্মে পারফরম্যান্সের জন্য ডিজাইনিং

তা বাদে উপরের উত্তরগুলি সত্য বলে ধরেছে।


2
প্রশ্নটি আবার পড়ুন। এটি ট্যাগ সহ কোথাও জেভিএমকে নির্দিষ্ট করে না। এটি কেবল জাভার উল্লেখ করেছে।
পিটার কেলি

9

জিসি অনেক স্বল্প জীবিত বস্তুর জন্য সুরযুক্ত tun

এটি বলেছিল যে যদি আপনি তুচ্ছভাবে অবজেক্ট বরাদ্দ হ্রাস করতে পারেন আপনার উচিত

একটি উদাহরণ একটি লুপ একটি স্ট্রিং নির্মাণ করা হবে, নিষ্পাপ উপায় হবে

String str = "";
while(someCondition){
    //...
    str+= appendingString;
}

যা Stringপ্রতিটি +=ক্রিয়াকলাপে একটি নতুন অবজেক্ট তৈরি করে (প্লাস এ StringBuilderএবং নতুন অন্তর্নিহিত চর অ্যারে)

আপনি সহজেই এটিকে আবার লিখতে পারেন:

StringBuilder strB = new StringBuilder();
while(someCondition){
    //...
    strB.append(appendingString);
}
String str = strB.toString();

এই প্যাটার্ন (অপরিবর্তনীয় ফলাফল এবং একটি স্থানীয় পরিবর্তনীয় মধ্যবর্তী মান) অন্যান্য জিনিসগুলিতেও প্রয়োগ করা যেতে পারে

তবে এর বাইরে ভূতের তাড়া না করে আপনার প্রকৃত বাধা খুঁজে পেতে কোনও প্রোফাইলার টানতে হবে


এই সবচেয়ে বড় সুবিধা StringBuilderপন্থা প্রাক আকারStringBuilder তাই এটি করা হয়েছে যা কখনো reallocate সঙ্গে অন্তর্নিহিত অ্যারের StringBuilder(int)কন্সট্রাকটর। এটি এটিকে বরাদ্দের চেয়ে একক1+N বরাদ্দ করে।

2
@ জারোদরবারসন স্ট্রিংবিল্ডার কমপক্ষে বর্তমানের ক্ষমতা দ্বিগুণ করবেন বা অন্য কথায় কেবল লগ (এন) বরাদ্দের জন্য ক্ষমতাটি তাত্পর্যপূর্ণভাবে বৃদ্ধি পাবে
র‌্যাচেট ফ্রেইক

6

জোশুয়া ব্লচ (জাভা প্ল্যাটফর্মের অন্যতম নির্মাতা) 2001 সালে তার কার্যকর জাভা বইয়ে লিখেছেন :

আপনার নিজের অবজেক্ট পুলটি বজায় রেখে অবজেক্ট তৈরি করা এড়ানো একটি খারাপ ধারণা, যদি না পুলে থাকা জিনিসগুলি অত্যন্ত ভারী ওজন না হয়। কোনও বস্তুর পুলকে ন্যায়সঙ্গত করে এমন কোনও সামগ্রীর একটি নমুনা উদাহরণ হ'ল ডেটাবেস সংযোগ। সংযোগ স্থাপনের ব্যয়টি যথেষ্ট পরিমাণে বেশি যে এটি এই বস্তুগুলির পুনরায় ব্যবহার করা বোধগম্য। সাধারণভাবে বলতে গেলে, আপনার নিজের অবজেক্ট পুলগুলি বজায় রাখার ফলে আপনার কোডগুলি বিশৃঙ্খলা সৃষ্টি হয়, মেমরির পদচিহ্ন বৃদ্ধি করে এবং কার্য সম্পাদনকে ক্ষতিগ্রস্থ করে। আধুনিক জেভিএম বাস্তবায়নে আবর্জনা সংগ্রহকারীদের অত্যন্ত অনুকূলিত করা হয়েছে যা সহজেই লাইটওয়েট অবজেক্টগুলিতে এই জাতীয় পলকে ছাপিয়ে যায়।


1
এমনকি নেটওয়ার্ক সংযোগের মতো জিনিসের সাথেও গুরুত্বপূর্ণ, সংযোগগুলির সাথে সম্পর্কিত জিসি-বরাদ্দ হওয়া অবজেক্টগুলি বজায় রাখা নয়, বরং জিসি-পরিচালিত বিশ্বের বাইরে থাকা সংযোগের সেটটি বজায় রাখা। এমন সময় আছে যখন পুলিংয়ের জিনিসগুলি নিজেরাই সহায়ক হতে পারে; সেই একই স্টেমগুলির মধ্যে বেশিরভাগ ক্ষেত্রে একই বস্তুর সাথে এক জোড়া রেফারেন্স শব্দার্থগতভাবে একই-তবে-পৃথক বস্তুর সাথে এক জোড়া রেফারেন্সের সমতুল্য হতে পারে তবে এর কিছু সুবিধা রয়েছে। উদাহরণস্বরূপ, একই পঞ্চাশ-হাজার-চরিত্রের স্ট্রিংয়ের দুটি উল্লেখ সমতার জন্য পরীক্ষা করা যেতে পারে ...
সুপারক্যাট

2
... সেই দৈর্ঘ্যের দুটি স্বতন্ত্র-তবে-অভিন্ন স্ট্রিংয়ের উল্লেখগুলির চেয়ে অনেক দ্রুত।
সুপারক্যাট

5

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

যাই হোক না কেন, অনুমান করার পরিবর্তে প্রকৃত পারফরম্যান্সের বাধা নির্ধারণ করার জন্য আপনার কোডটি প্রোফাইল না করা পর্যন্ত আপনার এই বিষয়গুলি নিয়ে চিন্তা করা শুরু করা উচিত নয়। ততক্ষণ, আপনার কোড পাঠযোগ্যতার জন্য সর্বোত্তম যা করা উচিত, কর্মক্ষমতা নয় not


জাভার প্রাথমিক সংস্করণগুলিতে আবর্জনা সংগ্রহকারী ফেলে দেওয়া বস্তুগুলি পরিষ্কার করার সময় যথেষ্ট পরিমাণ ব্যয় হয়েছিল। জাভার সাম্প্রতিক সংস্করণগুলি জিসি বিকল্পগুলিকে ব্যাপকভাবে বৃদ্ধি করেছে, সুতরাং অবজেক্ট তৈরি খুব কমই সমস্যা issue সাধারণত পৃষ্ঠার লোডের অংশ হিসাবে অ্যাপ্লিকেশন সার্ভারে জটিল কোনও কিছু গণনা না করা অবধি ওয়েব সিস্টেমগুলি বাইরের সিস্টেমে আইও কল দ্বারা সীমাবদ্ধ থাকে।
গ্রেগ

3

আমি মনে করি আপনার সহকর্মী অবশ্যই অপ্রয়োজনীয় বস্তু তৈরির দৃষ্টিকোণ থেকে বলেছেন। আমি বোঝাতে চাইছি আপনি যদি একই জিনিসটি ঘন ঘন তৈরি করে থাকেন তবে সেই বস্তুটি ভাগ করে নেওয়া ভাল is এমনকি এমন ক্ষেত্রে যেখানে অবজেক্ট তৈরি জটিল এবং আরও বেশি স্মৃতি লাগে, আপনি সেই বিষয়টিকে ক্লোন করতে এবং সেই জটিল অবজেক্ট তৈরির প্রক্রিয়া তৈরি করা এড়াতে চাইতে পারেন (তবে এটি আপনার প্রয়োজনের উপর নির্ভর করে)। আমি মনে করি "অবজেক্ট ক্রিয়েশন ব্যয়বহুল" বিবৃতিটি প্রসঙ্গে নেওয়া উচিত।

যতদূর JVM মেমরির প্রয়োজনীয়তা সম্পর্কিত, জাভা 8 এর জন্য অপেক্ষা করুন, আপনার এমনকি -Xmx নির্দিষ্ট করার দরকার নেই, মেটা স্পেস সেটিংসগুলি JVM মেমরির প্রয়োজনের যত্ন নেবে এবং এটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে।


লোকেরা কোনও উত্তর দেওয়ার সময় মন্তব্য করে রাখলে এটি খুব গঠনমূলক হবে। সর্বোপরি আমরা সকলেই এখানে জ্ঞান ভাগ করে নেওয়ার জন্য এসেছি এবং যথাযথ কারণ ছাড়াই রায় প্রদান করা কোনও উদ্দেশ্য পূরণ করে না।
একেএস

1
স্ট্যাক এক্সচেঞ্জের এমন কোনও ব্যবহারকারী থাকা উচিত যারা ব্যবহারকারীরা কোনও উত্তর দেয়, সে বিষয়ে কোনও উত্তর দেওয়া উচিত, যখন সেই উত্তরটিতে মন্তব্য পোস্ট করা হয়।
একেএস

1

মেমরি বরাদ্দ করার চেয়ে ক্লাস তৈরি করার আরও অনেক কিছুই রয়েছে। আরম্ভও আছে, আমি নিশ্চিত নই কেন সেই অংশটি সমস্ত উত্তর দ্বারা আবৃত নয়। সাধারন ক্লাসে কিছু ভেরিয়েবল থাকে এবং কিছু ফর্ম সূচনা করে এবং তা নিখরচায় নয়। ক্লাসটি কী তার উপর নির্ভর করে এটি ফাইলগুলি পড়তে পারে বা ধীরে ধীরে অপারেশন করতে পারে।

সুতরাং কেবল ক্লাস নির্মাতা কী করেন তা বিবেচনা করুন, এটি নিখরচায় কিনা তা নির্ধারণের আগে।


2
একটি ভাল নকশাযুক্ত শ্রেণীর কেবল এই কারণে এটির নির্মাণকারীকে ভারী-উত্তোলন করা উচিত নয়। উদাহরণস্বরূপ, আপনার ফাইল-পঠন ক্লাসটি কেবলমাত্র তার টার্গেট ফাইলটি শুরুতে উপস্থিত রয়েছে তা যাচাই করে এবং ফাইলটি থেকে ডেটা প্রয়োজন এমন প্রথম পদ্ধতি কল পর্যন্ত কোনও আসল ফাইল ক্রিয়াকে মুলতবি করে তার ইনস্ট্যান্টেশন ব্যয়টি হ্রাস করতে পারে।
গর্ডনএম

2
অতিরিক্ত খরচ যদি 'ইফ (ফার্স্টটাইম)' এ সরিয়ে নেওয়া হয় তবে লুপে ক্লাস পুনরুদ্ধার করা ক্লাসটির পুনরায় ব্যবহারের চেয়ে আরও ব্যয়বহুল।
অ্যালেক্স

আমি একটি অনুরূপ উত্তর পোস্ট করতে চলেছিলাম, এবং আমি বিশ্বাস করি যে এটি সঠিক উত্তর। অনেক লোক এই কথার দ্বারা অন্ধ হয়ে যায় যে জাভা অবজেক্ট তৈরি করা সস্তা যে তারা বুঝতে পারে না যে প্রায়শই নির্মাতারা বা আরও প্রাথমিকভাবে সস্তা থেকে দূরে থাকতে পারে। উদাহরণস্বরূপ সুইংতে ইমেজ আইকন ক্লাস, আপনি যদি এটি প্রাক লোড ইমেজ অবজেক্টটি পাস করেন তবে কনস্ট্রাক্টরটি বেশ ব্যয়বহুল। এবং আমি @ গর্ডনএম এর সাথে একমত নই, জেডি কে থেকে অনেকগুলি ক্লাস কনস্ট্রাক্টরের বেশিরভাগ থাই সঞ্চালন করে এবং আমি মনে করি এটি কোডকে আরও ভালভাবে ডিজাইন করেছে better
কিওয়ার্টজগুয়ে

1

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

এই বলে যে, যদি আপনার পারফরম্যান্সের প্রয়োজনীয়তাগুলি যথেষ্ট সমালোচিত হয়ে ওঠে (যেমন বাস্তব ব্যবহারকারী-শেষের প্রয়োজনীয়তার সাথে পরিমাপ করা হয়), তবে অবজেক্টগুলি একটি ওভারহেড বহন করে তবে আমি সৃষ্টি / বরাদ্দের ক্ষেত্রে এটিকে এতটা ভাবব না। এটা তোলে যেমন প্রতিফলন আর গতিশীল প্রেরণ (যেমন ধারণা সমর্থন করার জন্য প্রয়োজনীয় রেফারেন্স এলাকা এবং জাভা অন্তর্গত সমস্ত বস্তুর অতিরিক্ত আকার সঙ্গে কাজ করতে আরো আছে Floatচেয়ে বড় floatপ্রায়ই 4 বার তার প্রান্তিককরণ প্রয়োজনীয়তা 64-বিট বৃহত্তর ভালো কিছু, এবং একটি অ্যারের Floatঅগত্যা আমি যা বুঝতে পারি তা থেকে সংগৃহীত গ্যারান্টিযুক্ত নয়)।

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

তবে আমি উত্স কোডটি ঘুরে দেখলাম এবং এটি যখন তুচ্ছ ব্যয়ে প্রচুর পরিমাণে অবজেক্ট ব্যবহার করছিল, তখন পথের অনুসরণকারী (বিভিএইচ এবং ত্রিভুজ এবং উপকরণ) এর সবচেয়ে গুরুত্বপূর্ণ অংশগুলি খুব স্পষ্টভাবে এবং ইচ্ছাকৃতভাবে আদিম ধরণের বড় অ্যারের পক্ষে আইটেমগুলি এড়ানো হয়েছে ( বেশিরভাগ float[]এবং int[]), যা floatঅ্যারে থেকে অন্যটিতে যাওয়ার জন্য এটি অনেক কম মেমরির এবং গ্যারান্টিযুক্ত স্থানিক লোকাল ব্যবহার করে । আমি মনে করি না যে এটি ভাবতে খুব জল্পনা করা যায়, যদি লেখক পছন্দমত পছন্দসই বাক্সযুক্ত ধরণের ব্যবহার করেনFloatসেখানে, এটি তার পারফরম্যান্সের পরিবর্তে বড় আকারে এসে পৌঁছেছিল। তবে আমরা সেই ইঞ্জিনটির সবচেয়ে সম্পূর্ণ সমালোচনামূলক অংশের সাথে কথা বলছি, এবং আমি নিশ্চিত যে, বিকাশকারী কতটা দক্ষতার সাথে এটি অপ্টিমাইজ করেছেন, তিনি যে এটি পরিমাপ করেছেন এবং সেই অপটিমাইজেশনটি খুব, খুব যুক্তিসঙ্গতভাবে প্রয়োগ করেছেন, যেহেতু তিনি আনন্দের সাথে অন্য কোথাও অবজেক্টগুলিকে ব্যবহার করেছিলেন। তার চিত্তাকর্ষক রিয়েলটাইম পাথ ট্রেসারের কাছে তুচ্ছ ব্যয়।

আমাকে একজন সহকর্মী জানিয়েছিলেন যে জাভা অবজেক্ট তৈরি করা আপনার পক্ষে সবচেয়ে ব্যয়বহুল অপারেশন। সুতরাং আমি যতটা সম্ভব কম কয়েকটি অবজেক্ট তৈরির সিদ্ধান্তে পৌঁছাতে পারি।

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


1
আপনার প্রথম অনুচ্ছেদটি সঠিক পথে রয়েছে। এডেন এবং যুব স্পেসগুলি হ'ল প্রায় অনুলিপিযুক্ত অনুলিপি সংগ্রহকারী use মৃত বস্তুর জন্য 0 খরচ। আমি এই উপস্থাপনাটির উচ্চ প্রস্তাব দিচ্ছি । পাশের নোটে, আপনি বুঝতে পারছেন যে এই প্রশ্নটি 2012 থেকে এসেছে, তাই না?
জিমি জেমস

@ জিমি জেমস আমি বিরক্ত হয়ে পড়েছি এবং পুরানোগুলি সহ প্রশ্নগুলি সন্ধান করতে পছন্দ করি। আমি আশা করি লোকেরা আমার খারাপ লাগবে না! :-D
ড্রাগন এনার্জি

@ জিমি জেমস এটি কি আর বাক্সে নেই যে বাক্সযুক্ত ধরণের অতিরিক্ত মেমরির প্রয়োজনীয়তা রয়েছে এবং অ্যারেতে সংলগ্ন হওয়ার গ্যারান্টি নেই? আমি মনে বস্তু ময়লা জাভা সস্তা ঝোঁক কিন্তু এক ক্ষেত্রে যেখানে তারা অপেক্ষাকৃত ব্যয়বহুল হতে পারে ভালো হয় float[]বনাম Float[], যেখানে সাবেক ক্রমানুসারে একটি মিলিয়ন প্রক্রিয়াকরণের দ্বিতীয়টির থেকে অপেক্ষাকৃত বেশ দ্রুত হতে পারে।
ড্রাগন এনার্জি

1
আমি যখন এখানে প্রথম পোস্ট করা শুরু করেছি তখন আমিও একইভাবে করেছি। পুরানো প্রশ্নের উত্তরগুলি খুব কম মনোযোগ দেওয়ার প্রবণতা দেখলে অবাক হবেন না।
জিমি জেমস

1
আমি নিশ্চিত যে বাক্সযুক্ত প্রকারগুলি আদিমদের চেয়ে বেশি স্থান ব্যবহার করা উচিত বলে ধারণা করা উচিত। আশেপাশে সম্ভাব্যরূপে অপ্টিমাইজেশন রয়েছে তবে আমি সাধারণভাবে, আমি মনে করি এটি আপনি যেমন বর্ণনা করেছেন তেমনই রয়েছে। গিল তেনে (উপরের উপস্থাপনাটির) একটি বিশেষ ধরণের সংগ্রহ যুক্ত করার প্রস্তাব সম্পর্কে আরও একটি কথা রয়েছে যা স্ট্রাক্টের কিছু সুবিধা দেয় তবে এখনও অবজেক্ট ব্যবহার করে। এটি একটি আকর্ষণীয় ধারণা, আমি জেএসআরের অবস্থান সম্পর্কে নিশ্চিত নই। ব্যয়টি মূলত সময়টির কারণে হয় যা আপনি ইঙ্গিত করেন। যদি আপনি আপনার অবজেক্টগুলিকে 'পালাতে' দেওয়া এড়াতে পারেন তবে এগুলি এমনকি স্ট্যাক বরাদ্দ করা যেতে পারে এবং কখনই গাদাটি স্পর্শ করতে পারে না।
জিমি জেমস

0

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

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

এখানে এই বিষয়ে একটি দুর্দান্ত উপস্থাপনা: https://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-e કાર્ય-java-tutorial.pdf


0

আমি এ সম্পর্কিত একটি দ্রুত মাইক্রোব্যাঙ্কমার্ক করেছি এবং আমি গিথুবে সম্পূর্ণ উত্স সরবরাহ করেছি । আমার উপসংহারটি হ'ল অবজেক্ট তৈরি করা ব্যয়বহুল কিনা বা তা নয়, তবে জিসি আপনার জন্য জিনিসগুলির যত্ন নেবে এই ধারণাটি নিয়ে ক্রমাগত অবজেক্ট তৈরি করা আপনার অ্যাপ্লিকেশনটি খুব তাড়াতাড়ি জিসি প্রক্রিয়াটিকে ট্রিগার করবে। জিসি একটি অত্যন্ত ব্যয়বহুল প্রক্রিয়া এবং যখনই সম্ভব এটি এড়ানো ভাল এবং এটিকে লাথি মারার চেষ্টা না করা ভাল।


এটি পূর্বের 15 টি উত্তরগুলিতে তৈরি এবং ব্যাখ্যা করা পয়েন্টগুলির চেয়ে বেশি কিছু দেওয়ার প্রস্তাব দিচ্ছে না। কমই একটি একটি প্রশ্ন বছর 2 বছরেরও বেশি আগে জিজ্ঞাসা করা হল এবং একটি অর্জিত হয়েছে bumping মূল্য বিষয়বস্তু খুব পুঙ্খানুপুঙ্খ জবাব
মশা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.