সি প্রোগ্রামিং ল্যাঙ্গুয়েজে রান টাইম মেমরি বরাদ্দ করার মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে কি?


উত্তর 1:

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

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

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

আপনি জিজ্ঞাসা করেছিলেন: রান প্রোগ্রামে মেমরি বরাদ্দকরণের তুলনায় সি প্রোগ্রামিং ভাষায় কমপ্লাইল টাইমের মধ্যে পারফরম্যান্সের পার্থক্য রয়েছে কি?


উত্তর 2:

হ্যাঁ এটি সংকলনের সময়ে এটি করা স্পষ্টতই দ্রুত তবে এটি নির্ভর করে। মূলত আপনি সংকলনের সময় দিয়ে যা করছেন তা রানটাইমের সময় কী হবে তা পূর্বনির্ধারিত।

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

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


উত্তর 3:

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

সুতরাং

সংকলন সময়:

স্ট্যাটিক চর বিগস্ট্রিং [5000];

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

রানটাইম:

চর * পিবিগস্ট্রিং = ম্যালোক (5000);

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

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


উত্তর 4:

আসল মেমরি অ্যাক্সেস পড়া এবং লেখার জন্য হুবহু একই রকম। তবে রান সময়ে মেমরির বন্টন করতে সময় লাগে। (এবং ব্যর্থ হতে পারে!)।

স্মৃতি স্মৃতি। ডিস্ক পড়া এবং লেখার চেয়ে ইউএসবি স্থানান্তর ইত্যাদির চেয়ে এটি আরও দ্রুত Main

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

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

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

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

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

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

কিছু ওএস এমনকি আপনাকে একটি মেমরি-ম্যাপযুক্ত ফাইল সিস্টেম ইতিমধ্যে দেয় যা আপনি ঠিক একটি নিয়মিত ফাইল বা ডিরেক্টরিতে ব্যবহার করতে পারেন! (লিনাক্সের / var / run / shm ("শেয়ার করা মেম") ডিরেক্টরি রয়েছে যেখানে আপনি এটি করতে পারেন - খুব দ্রুত))