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

এটি স্থির-সময় সন্নিবেশগুলি এবং অপসারণের জন্য একটি নিখরচায় ব্লকগুলির জন্য নিখরচায় (একটি ব্লক যা পূর্ণ নয়) এবং সেই ব্লকের সূচকগুলির জন্য ব্লকের ভিতরে একটি উপ-মুক্ত তালিকা অর্জনের জন্য একটি ডাবল ফ্রি তালিকা ব্যবহার করে free সন্নিবেশ উপর পুনরায় দাবি করা প্রস্তুত।
আমি এই কাঠামোর উপকারিতা এবং কভারগুলি কভার করব। আসুন কয়েকটি কনস দিয়ে শুরু করি কারণ তাদের মধ্যে অনেকগুলি রয়েছে:
কনস
- এই কাঠামোর জন্য
std::vector(একটি খাঁটি কাঠামোগত কাঠামো) চেয়ে কয়েক মিলিয়ন উপাদান সন্নিবেশ করতে প্রায় 4 গুণ বেশি সময় লাগে । এবং আমি মাইক্রো-অপ্টিমাইজেশনে বেশ শালীন কিন্তু সাধারণ ক্ষেত্রে প্রথমে ব্লক ফ্রি তালিকার শীর্ষে ফ্রি ব্লকটি পরিদর্শন করতে হবে, তারপরে ব্লকটি অ্যাক্সেস করতে হবে এবং ব্লকের একটি মুক্ত সূচক পপ করুন concept ফ্রি তালিকাতে, ফ্রি পজিশনে উপাদানটি লিখুন এবং তারপরে ব্লকটি পূর্ণ কিনা তা পরীক্ষা করুন এবং যদি ব্লক ফ্রি তালিকা থেকে ব্লকটি পপ করুন। এটি এখনও একটি ধ্রুবক-সময় অপারেশন তবে পিছনে চাপ দেওয়ার চেয়ে অনেক বড় ধ্রুবক সহ std::vector।
- সূচিকরণের জন্য অতিরিক্ত গাণিতিক এবং ইন্ডিরিশনের অতিরিক্ত স্তরকে প্রদত্ত এলোমেলোভাবে অ্যাক্সেস প্যাটার্ন ব্যবহার করে উপাদানগুলিতে অ্যাক্সেস করতে প্রায় দ্বিগুণ সময় লাগে।
- ক্রমবর্ধমান অ্যাক্সেস একটি আয়রেটর ডিজাইনে দক্ষতার সাথে মানচিত্র তৈরি করে না কারণ প্রতিটি বার যখন এটি বাড়ানো হয় তখন অতিরিক্ত শাখা পরিচালনা করতে হয়।
- এটির বেশিরভাগ মেমরি ওভারহেড থাকে, সাধারণত উপাদান প্রতি 1 বিট প্রায়। উপাদান প্রতি 1 বিট খুব বেশি শোনায় না, তবে আপনি যদি এটি ব্যবহার করে এক মিলিয়ন 16-বিট পূর্ণসংখ্যা সংরক্ষণ করতে পারেন তবে এটি একটি নিখুঁত কমপ্যাক্ট অ্যারের চেয়ে 6.25% বেশি মেমরি ব্যবহার। যাইহোক, অনুশীলনে এটি যতটা সংরক্ষণ করে তার অতিরিক্ত ক্ষমতা
std::vectorঅপসারণের জন্য কমপ্যাক্ট না করে আপনি তার চেয়ে কম স্মৃতি ব্যবহার করবেন vector। এছাড়াও আমি সাধারণত এ জাতীয় কিশোর উপাদানগুলি সঞ্চয় করতে এটি ব্যবহার করি না।
পেশাদাররা
for_eachক্রিয়াকলাপের অ্যাক্সেস যা কোনও ব্লকের মধ্যে কলব্যাক প্রসেসিং রেঞ্জের উপাদানগুলির সীমাবদ্ধ অ্যাক্সেসের গতিকে প্রায় প্রতিদ্বন্দ্বী করে std::vector(কেবলমাত্র 10% ডিফের মতো), তাই এটি আমার পক্ষে সবচেয়ে কার্য সম্পাদন-সমালোচনামূলক ব্যবহারের ক্ষেত্রে খুব কম দক্ষ নয় ( একটি ইসিএস ইঞ্জিনে ব্যয় করা বেশিরভাগ সময় অনুক্রমিক অ্যাক্সেসে থাকে)।
- এটি পুরোপুরি খালি হয়ে গেলে কাঠামোটিকে হ্রাসকারী ব্লকগুলির সাথে মধ্য থেকে ধ্রুবক-সময় অপসারণের অনুমতি দেয়। ফলস্বরূপ এটি প্রয়োজনীয়ভাবে ডেটা স্ট্রাকচারটি উল্লেখযোগ্যভাবে আরও বেশি মেমরি ব্যবহার করে না তা নিশ্চিত করার পক্ষে যথেষ্ট শালীন।
- এটি সেই উপাদানগুলিতে সূচকগুলি অকার্যকর করে না যা সরাসরি পাত্রে সরানো হয় না কারণ এটি পরবর্তী সন্নিবেশের পরে এই গর্তগুলি পুনরায় দাবি করার জন্য একটি বিনামূল্যে তালিকা পদ্ধতির সাহায্যে পিছনে গর্ত ফেলে।
- স্মৃতিচারণা শেষ হওয়ার বিষয়ে আপনাকে এতটা চিন্তা করতে হবে না এমনকি যদি এই কাঠামোটিতে একটি মহাকাশ সংখ্যক উপাদান রয়েছে তবে এটি কেবল ছোট সংক্ষিপ্ত ব্লকগুলির জন্যই অনুরোধ করে যা বিপুল সংখ্যক অনাবৃত ব্যবহারের সন্ধান করতে ওএসের পক্ষে কোনও চ্যালেঞ্জ তৈরি করে না which পেজ।
- এটি পুরো কাঠামোটি লক না করেই একত্রে এবং থ্রেড-সুরক্ষার জন্য নিজেকে ভাল ধার দেয়, যেহেতু অপারেশনগুলি সাধারণত ব্যক্তিগত ব্লকে স্থানীয়করণ করা হয়।
এখন আমার কাছে সবচেয়ে বড় সুবিধাটি হ'ল এই ডেটা কাঠামোর একটি অপরিবর্তনীয় সংস্করণ তৈরি করা তুচ্ছ হয়ে উঠল:

তার পর থেকে, এর ফলে পার্শ্ব প্রতিক্রিয়াবিহীন আরও বেশি কার্যকারিতা লেখার জন্য সকল ধরণের দরজা উন্মুক্ত হয়েছিল যা ব্যতিক্রম-সুরক্ষা, থ্রেড-সুরক্ষা ইত্যাদি অর্জন করা আরও সহজ করে তুলেছিল অপরিবর্তনীয়তা আমি আবিষ্কার করি এমন একটি জিনিস যা আমি সহজেই অর্জন করতে পারি with এই ডেটা কাঠামোটি অনড় দৃষ্টিতে এবং দুর্ঘটনাক্রমে, তবে যুক্তিযুক্তভাবে এটির একটি সর্বোত্তম সুবিধার মধ্যে থেকে এটি শেষ হয়েছে যেহেতু এটি কোডবেসটি বজায় রাখা আরও সহজ করেছে।
অ-সংযুক্ত অ্যারেতে ক্যাশে লোকেশন নেই যার ফলস্বরূপ খারাপ পারফরম্যান্স হয়। তবে একটি 4 এম ব্লকের আকারে দেখে মনে হচ্ছে ভাল ক্যাশিংয়ের জন্য যথেষ্ট লোকেশন থাকবে।
রেফারেন্সের স্থানীয়তা সেই আকারের ব্লকগুলি নিয়ে নিজেকে উদ্বিগ্ন করার মতো কিছু নয়, কেবল 4 কিলোবাইট ব্লক রেখে দিন। একটি ক্যাশে লাইন সাধারণত 64 বাইট হয়। আপনি যদি ক্যাশে মিসগুলি হ্রাস করতে চান, তবে কেবলমাত্র সেইগুলি ব্লকগুলি সঠিকভাবে সারিবদ্ধ করার দিকে মনোনিবেশ করুন এবং সম্ভব হলে আরও ক্রমবর্ধমান অ্যাক্সেস প্যাটার্নের পক্ষে হন।
একটি এলোমেলো অ্যাক্সেস মেমরি প্যাটার্নকে অনুক্রমিকভাবে রূপান্তরিত করার খুব দ্রুত উপায় হ'ল বিটসেট ব্যবহার করা। ধরা যাক আপনার কাছে সূচকগুলির একটি নৌকা ভার রয়েছে এবং এগুলি এলোমেলোভাবে রয়েছে। আপনি কেবল সেগুলির মাধ্যমে লাঙল করতে পারেন এবং বিটসেটে বিটগুলি চিহ্নিত করতে পারেন। তারপরে আপনি আপনার বিটসেটের মাধ্যমে পুনরাবৃত্তি করতে পারেন এবং কোন বাইটটি শূন্য নয় তা যাচাই করতে পারেন, একবারে 64৪-বিট পরীক্ষা করে দেখুন। একবার আপনি 64৪-বিটের একটি সেটের মুখোমুখি হলেন যার মধ্যে কমপক্ষে একটি বিট সেট হয়ে গেলে আপনি কী বিট সেট আছে তা দ্রুত নির্ধারণ করতে আপনি এফএফএস নির্দেশাবলী ব্যবহার করতে পারেন । বিটগুলি আপনাকে সূচকগুলি ক্রম অনুসারে বাছাই করা ব্যতীত আপনাকে কী সূচকগুলি অ্যাক্সেস করতে হবে তা বলে।
এটির কিছুটা ওভারহেড রয়েছে তবে কিছু ক্ষেত্রে এটি সার্থক বিনিময় হতে পারে, বিশেষত যদি আপনি এই সূচকগুলি বহুবার লুপ করে চলেছেন।
কোনও আইটেম অ্যাক্সেস করা ততটা সহজ নয়, ইন্ডিয়ারেশনের একটি অতিরিক্ত স্তর রয়েছে। এই কি দূরে অপ্টিমাইজড পাবেন? এটি কি ক্যাশে সমস্যা সৃষ্টি করবে?
না, এটি অপ্টিমাইজ করা যায় না। এলোমেলোভাবে অ্যাক্সেস, কমপক্ষে, এই কাঠামোর সাথে সর্বদা বেশি ব্যয় হবে। এটি প্রায়শই আপনার ক্যাশে মিস করে না এমনটা বাড়িয়ে তোলে না যেহেতু আপনি ব্লকগুলিতে পয়েন্টারগুলির অ্যারে দিয়ে উচ্চ সাময়িক লোকাল পাবেন to
যেহেতু 4M সীমা হিট হওয়ার পরে রৈখিক বৃদ্ধি রয়েছে, তাই আপনি সাধারণত আপনার চেয়ে অনেক বেশি বরাদ্দ রাখতে পারেন (বলুন, 1GB মেমরির জন্য সর্বাধিক 250 টি বরাদ্দ)। 4 এম এর পরে কোনও অতিরিক্ত মেমরি অনুলিপি করা হয়নি, তবে আমি নিশ্চিত নই যে অতিরিক্ত বরাদ্দ মেমরির বিশাল অংশগুলি অনুলিপি করার চেয়ে বেশি ব্যয়বহুল।
অনুশীলনে অনুলিপিটি প্রায়শই দ্রুত হয় কারণ এটি বিরল ঘটনা মাত্র একবারের মতো কিছু log(N)/log(2)সময় ঘটে যখন একইসাথে ময়লা সস্তা সাধারণ ক্ষেত্রে সহজ হয় যেখানে আপনি অ্যারেতে কোনও উপাদান পূর্ণ হয়ে যাওয়ার আগে অনেকবার লিখে ফেলতে পারেন এবং আবার পুনঃনির্ধারণের প্রয়োজন হয়। সুতরাং সাধারণত আপনি এই ধরণের কাঠামোর সাথে দ্রুত সন্নিবেশ পাবেন না কারণ সাধারণ কেস কাজটি আরও ব্যয়বহুল হলেও এমনকি যদি বিশাল অ্যারেগুলি পুনর্নির্মাণের ব্যয়বহুল বিরল ক্ষেত্রে এটি মোকাবেলা করতে না হয়।
আমার কাছে এই কাঠামোর প্রাথমিক আবেদনটি সমস্ত মতামত সত্ত্বেও মেমোরির ব্যবহার হ্রাস করে, ওওএমের বিষয়ে চিন্তা না করে, সূচকগুলি এবং পয়েন্টারগুলি সঞ্চয় করতে সক্ষম হয় যা অবৈধ, চুক্তি এবং অপরিবর্তনীয়তা পায় না। এটি এমন একটি ডেটা স্ট্রাকচার পেয়ে ভাল লাগে যেখানে আপনি ধ্রুবক সময়ে জিনিসগুলি সন্নিবেশ করতে এবং সরাতে পারবেন যখন এটি আপনার জন্য নিজেকে পরিষ্কার করে দেয় এবং কাঠামোর মধ্যে পয়েন্টার এবং সূচকগুলি অকার্যকর করে না।