যদিও @ মার্ক একটি দুর্দান্ত বিশ্লেষণ দিয়েছেন (যা আমি মনে করি) একটি দুর্দান্ত বিশ্লেষণ দিয়েছে, কিছু লোক হয়তো কিছুটা ভিন্ন কোণ থেকে জিনিসগুলি বিবেচনা করতে পছন্দ করতে পারে।
একটি হ'ল রিলোকেশন করার কিছুটা ভিন্ন উপায় বিবেচনা করা। পুরাতন স্টোরেজ থেকে সমস্ত স্টোরটি নতুন স্টোরেজে অনুলিপি করার পরিবর্তে একবারে কেবলমাত্র একটি উপাদান অনুলিপি করে বিবেচনা করুন - অর্থাত্, প্রতিবার আপনি যখন একটি পুশব্যাক করেন, এটি নতুন স্থানটিতে নতুন উপাদান যুক্ত করে, এবং উপস্থিত একটির অনুলিপি করে পুরাতন স্থান থেকে নতুন স্থান পর্যন্ত উপাদান। 2 এর বৃদ্ধির ফ্যাক্টর ধরে নিলে এটি স্পষ্টভাবে স্পষ্ট যে নতুন স্থানটি পূর্ণ হলে আমরা পুরানো স্থান থেকে নতুন জায়গাতে সমস্ত উপাদান অনুলিপি করে শেষ করব এবং প্রতিটি ধাক্কা ব্যাকটি ঠিক ধ্রুবক সময় হয়ে গেছে। এই মুহুর্তে, আমরা পুরানো স্থানটি বাতিল করব, মেমরির একটি নতুন ব্লক বরাদ্দ করব যা দ্বিগুণ লাভের চেয়ে দ্বিগুণ ছিল এবং প্রক্রিয়াটি পুনরাবৃত্তি করবে।
খুব সুন্দরভাবে, আমরা এটি অনির্দিষ্টকালের জন্য চালিয়ে যেতে পারি (বা যতক্ষণ না স্মৃতি উপলব্ধ থাকে ততক্ষণ) এবং প্রতিটি পুশব্যাকের মধ্যে একটি নতুন উপাদান যুক্ত করা এবং একটি পুরানো উপাদান অনুলিপি করা জড়িত।
একটি সাধারণ প্রয়োগের এখনও ঠিক একই সংখ্যক অনুলিপি থাকে - তবে একবারে একবারে অনুলিপি করার পরিবর্তে এটি সমস্ত বিদ্যমান উপাদান একবারে অনুলিপি করে। একদিকে, আপনি ঠিক বলেছেন: এর অর্থ এই নয় যে আপনি যদি পুশ_ব্যাকের স্বতন্ত্র অনুরোধগুলি দেখেন তবে সেগুলির কয়েকটি অন্যের তুলনায় যথেষ্ট ধীর হবে। তবে যদি আমরা একটি দীর্ঘমেয়াদী গড়ের দিকে লক্ষ্য করি তবে, ভেক্টরের আকার নির্বিশেষে পুশ_ব্যাকের অনুরোধ অনুসারে কপি করা পরিমাণটি স্থির থাকে।
যদিও এটি গণনামূলক জটিলতার সাথে অপ্রাসঙ্গিক, আমি মনে করি যে এটি করা হিসাবে কাজগুলি করা কেন সুবিধাজনক তা উল্লেখ করা মূল্যবান, প্রতি পুশ_ব্যাক প্রতি একটি উপাদান অনুলিপি না করে, তাই প্রতি পুশ_ব্যাক সময় স্থির থাকে। বিবেচনা করার জন্য কমপক্ষে তিনটি কারণ রয়েছে।
প্রথমটি হ'ল মেমরির সহজলভ্যতা। পুরানো স্মৃতি অনুলিপিটি শেষ হওয়ার পরেই অন্যান্য ব্যবহারের জন্য মুক্ত করা যায়। আপনি যদি একবারে কেবল একটি আইটেম অনুলিপি করেন তবে পুরানো মেমরির ব্লকটি বেশি দিন বরাদ্দ থাকবে। আসলে, আপনি একটি পুরাতন ব্লক এবং একটি নতুন ব্লক মূলত সারাক্ষণ বরাদ্দ রাখতে চান। যদি আপনি দু'জনের চেয়ে ছোট গ্রোথ ফ্যাক্টর (যা আপনি সাধারণত চান) স্থির করে থাকেন তবে আপনার সারাক্ষণ আরও বেশি মেমরি বরাদ্দ থাকা দরকার।
দ্বিতীয়ত, আপনি যদি একবারে কেবল একটি পুরাতন উপাদান অনুলিপি করেন, অ্যারেতে সূচি তৈরি করা আরও কিছুটা জটিল হবে - প্রতিটি সূচীকরণ ক্রিয়াকলাপটি নির্ধারণ করতে হবে যে প্রদত্ত সূচিতে থাকা উপাদানটি বর্তমানে মেমরির পুরানো ব্লকের মধ্যে রয়েছে কিনা নতুন একটি. এটি কোনও উপায়ে মারাত্মক জটিল নয়, তবে অ্যারের সাথে সূচিকরণের মতো প্রাথমিক ক্রিয়াকলাপের জন্য প্রায় কোনও ধীর গতি উল্লেখযোগ্য হতে পারে।
তৃতীয়ত, একবারে সমস্ত অনুলিপি করে, আপনি ক্যাশিংয়ের আরও অনেক ভাল সুবিধা গ্রহণ করেন। একবারে সমস্ত অনুলিপি করা, আপনি বেশিরভাগ ক্ষেত্রেই উত্স এবং গন্তব্য উভয়ই ক্যাশে থাকবেন বলে আশা করতে পারেন, সুতরাং ক্যাশে মিসের ব্যয়টি ক্যাশের লাইনে মাপসই করা উপাদানের সংখ্যার উপর ভিত্তি করে সঞ্চারিত হয়। আপনি যদি একবারে একটি উপাদান অনুলিপি করেন তবে আপনার অনুলিপি করা প্রতিটি উপাদানগুলির জন্য সহজেই ক্যাশে মিস থাকতে পারে। এটি কেবল জটিলতা নয়, ধ্রুবক ফ্যাক্টরটিকে পরিবর্তন করে, তবে এটি এখনও যথেষ্ট তাৎপর্যপূর্ণ হতে পারে - একটি সাধারণ মেশিনের জন্য, আপনি খুব সহজেই 10 থেকে 20 এর একটি ফ্যাক্টর আশা করতে পারেন।
এক মুহুর্তের জন্য এটি সম্ভবত অন্য দিকটি বিবেচনা করার পক্ষেও উপযুক্ত: আপনি যদি রিয়েল-টাইম প্রয়োজনীয়তা সহ একটি সিস্টেম ডিজাইন করেন, তবে একবারে সমস্ত পরিবর্তে একবারে কেবলমাত্র একটি উপাদান অনুলিপি করা ভাল ধারণা হতে পারে। যদিও সামগ্রিক গতি কম হতে পারে (বা নাও হতে পারে) তবুও পুশ_ব্যাকের একক মৃত্যুদন্ড কার্যকর করার জন্য আপনার যে শক্তিশালী উপরের আবদ্ধ হতে হবে তা মনে করে - আপনি রিয়েল-টাইম বরাদ্দকারী ছিলেন (যদিও অবশ্যই অনেকগুলি রিয়েল-টাইম রয়েছে সিস্টেমগুলি কেবলমাত্র মেমরির গতিশীল বরাদ্দকে কমপক্ষে রিয়েল-টাইম প্রয়োজনীয়তার অংশগুলিতে নিষিদ্ধ করে।