সি #

সি # তে মেমরি বরাদ্দ করা তুলনামূলকভাবে ব্যয়বহুল এবং কোনও পারফরম্যান্স-সমালোচনামূলক অ্যাপ্লিকেশনটির জন্য এটি অপ্টিমাইজেশনের মূল পয়েন্ট। অবজেক্ট পুলিং এমন একটি কৌশল যা মেমরি-নিবিড় অ্যাপ্লিকেশনটির ওভারহেড হ্রাস করতে সহায়তা করে।

কীভাবে অবজেক্ট পুলিং পারফরম্যান্স উন্নত করে?

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

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

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

এই কোডটি 10,000 বার চলবে এবং ফাংশন শেষে 10,000 মালিকবিহীন তালিকা মেমরিতে বরাদ্দ রাখবে।

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

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

এই উদাহরণস্বরূপ, পুনর্ব্যবহারযোগ্য পদ্ধতির চলমান হবে new List প্রথম বরাদ্দটি করতে লুপের আগে এবং তারপরে চলছে .Clear বা তৈরি করা মেমরির জায়গা এবং আবর্জনা সঞ্চয় করতে ডেটা পুনরায় সেট করা। এই লুপটি শেষ হওয়ার পরে, কেবলমাত্র স্মৃতিতে একটি তালিকা থাকবে যা তাদের 10,000 টির চেয়ে অনেক ছোট।

প্রথম বরাদ্দটি করতে লুপের আগে নতুন তালিকা চালান, তারপরে চালান memory মেমরির স্থান এবং আবর্জনা তৈরি করে সংরক্ষণ করতে ডেটা সাফ বা পুনরায় সেট করুন।

অবজেক্ট পুলিং মূলত এই ধারণার জেনেরিক প্রয়োগ। এটি বস্তুর সংগ্রহ যা পুনরায় ব্যবহার করা যেতে পারে। এর জন্য কোনও অফিসিয়াল ইন্টারফেস নেই, তবে সাধারণভাবে তাদের একটি অভ্যন্তরীণ ডেটা স্টোর রয়েছে এবং দুটি পদ্ধতি প্রয়োগ করে: GetObject(), এবং ReleaseObject()

একটি নতুন অবজেক্ট বরাদ্দ না করে আপনি অবজেক্ট পুল থেকে একটি অনুরোধ করুন। পুলটি একটি নতুন অবজেক্ট তৈরি করতে পারে যদি এটির কাছে এটি উপলব্ধ না থাকে। তারপরে, আপনি এটি সম্পন্ন করার পরে, আপনি সেই বস্তুকে পুলটিতে ছেড়ে দেন। আবর্জনায় বস্তুটিকে ছক দেওয়ার পরিবর্তে, অবজেক্ট পুল এটিকে বরাদ্দ রাখে তবে সমস্ত ডেটা থেকে পরিষ্কার করে দেয়। পরের বার আপনি দৌড়াবেন GetObjectএটি নতুন খালি বস্তুটি ফেরত দেয়। তালিকার মতো বৃহত অবজেক্টের জন্য অন্তর্নিহিত মেমরিটিতে এটি করা আরও সহজ।

একটি নতুন অবজেক্ট বরাদ্দ না করে, অবজেক্ট পুল থেকে একটি অনুরোধ করুন।

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

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

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

আপনি যদি অবজেক্ট পুলগুলি ব্যবহার করতে চান তবে মাইক্রোসফ্ট একটি বাস্তবায়ন প্রস্তাব করে Microsoft.Extensions.ObjectPool। আপনি যদি এটি নিজে প্রয়োগ করতে চান তবে এটি কীভাবে কাজ করে তা পরীক্ষা করার জন্য আপনি উত্সটি খুলতে পারেন DefaultObjectPool। সাধারণত, আপনার কাছে প্রতিটি ধরণের আলাদা আলাদা অবজেক্ট পুল থাকবে, যাতে পুলটিতে সর্বোচ্চ সংখ্যক অবজেক্ট থাকবে the