হাস্কেল ডেটা ধরণের মেমরির পদচিহ্ন


124

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

সাধারণভাবে, যদি মেমরির ধরণের প্রয়োজন হয় aএবং bএটি জানা থাকে তবে বীজগণিত ডেটা ধরণের মেমরির ওভারহেড কী যেমন:

data Uno = Uno a
data Due = Due a b

উদাহরণস্বরূপ, এই মানগুলি কয়টি বাইট মেমোরিতে দখল করে?

1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing

আমি বুঝতে পারি যে জঞ্জাল সংগ্রহের বিলম্বের কারণে প্রকৃত স্মৃতি বরাদ্দ বেশি। অলস মূল্যায়নের কারণে এটি উল্লেখযোগ্যভাবে আলাদা হতে পারে (এবং থাঙ্ক আকারটি আকারের সাথে সম্পর্কিত নয়)। একটি ডাটা টাইপ দেওয়া প্রশ্ন, সম্পূর্ণ মূল্যায়ন করা হয় যখন এর মান কত মেমরি লাগে?

আমি খুঁজে পেয়েছি :set +sজিএইচসিআইতে মেমরির পরিসংখ্যানগুলি দেখতে একটি বিকল্প রয়েছে, তবে কীভাবে একটি একক মানের মেমরির পদচিহ্নটি অনুমান করা যায় তা পরিষ্কার নয়।

উত্তর:


156

(নিম্নলিখিতটি জিএইচসির ক্ষেত্রে প্রযোজ্য, অন্যান্য সংকলকগণ বিভিন্ন স্টোরেজ কনভেনশন ব্যবহার করতে পারেন)

থাম্বের বিধি: একজন নির্মাণকারীর শিরোনামের জন্য একটি শব্দ এবং প্রতিটি ক্ষেত্রের জন্য একটি শব্দ ব্যয় হয় । ব্যতিক্রম: কোন ক্ষেত্রবিহীন কোনও কনস্ট্রাক্টর (যেমন Nothingবা True) কোনও স্থান নেয় না, কারণ জিএইচসি এই নির্মাণকারীগুলির একটি একক উদাহরণ তৈরি করে এবং এটি সমস্ত ব্যবহারের মধ্যে ভাগ করে দেয়।

একটি শব্দটি 32-বিট মেশিনে 4 বাইট এবং 64-বিট মেশিনে 8 বাইট।

সুতরাং যেমন

data Uno = Uno a
data Due = Due a b

an Unoলাগে 2 শব্দ, এবং একটি Dueলাগে 3।

Intটাইপ হিসাবে সংজ্ঞায়িত করা হয়

data Int = I# Int#

এখন, Int#একটি শব্দ লাগে, সুতরাং Intমোট 2 লাগে। সর্বাধিক unboxed ধরনের এক শব্দ গ্রহণ ব্যতিক্রম হচ্ছে Int64#, Word64#এবং Double#(ক 32 বিট মেশিনে) যা নিতে 2. GHC আসলে ধরনের ছোট মূল্যবোধের ক্যাশে আছে Intএবং Char, তাই অনেক ক্ষেত্রে এই সব সময়ে কোন গাদা স্থান গ্রহণ। আপনি Stringকেবলমাত্র>> Char255 ব্যবহার না করে কেবলমাত্র তালিকা তালিকার জন্য স্থান প্রয়োজন ।

একটির Int8সমান প্রতিনিধিত্ব আছে IntIntegerএই মত সংজ্ঞায়িত করা হয়:

data Integer
  = S# Int#                            -- small integers
  | J# Int# ByteArray#                 -- large integers

সুতরাং একটি ছোট Integer( S#) 2 টি শব্দ নেয় তবে একটি বড় পূর্ণসংখ্যা তার মানের উপর নির্ভর করে স্থান পরিবর্তনশীল পরিমাণ নেয়। এ ByteArray#অ্যারে নিজেই 2 টি শব্দ (শিরোলেখ + আকার) এবং আরও স্থান নেয়।

নোট করুন যে নির্ধারক নির্ধারিত newtypeএটি নিখরচায়newtypeনিখুঁতভাবে একটি সংকলন-সময় ধারণা, এবং এটি কোনও স্থান নেয় না এবং রান সময় কোনও নির্দেশের জন্য ব্যয় করে।

জিএইচসি মন্তব্য ভাষায় লেপ অফ হিপ অবজেক্টে আরও বিশদ ।


1
ধন্যবাদ সাইমন। এটিই আমি জানতে চেয়েছিলাম।
সাস্টানিন

2
শিরোনামটি কি দুটি শব্দ নয়? জিসি বা মূল্যায়নের সময় ব্যবহারের জন্য ট্যাগের জন্য একটি, এবং ফরওয়ার্ডিং পয়েন্টারটির জন্য একটি? সুতরাং যে আপনার মোট একটি শব্দ যুক্ত হবে না?
এডওয়ার্ড কেএমইটিটি

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

3
নামোমোলো: হ্যাঁ তবে ক্লোজার এইচ থেকে: / * একটি আপডেটের মানটি নেওয়ার জন্য একটি থ্যাঙ্কের একটি প্যাডিং শব্দ রয়েছে। এটি এমন যাতে আপডেটটি পেললোডকে ওভাররাইট না করে, তাই আমরা প্রবেশ এবং আপডেটের সময় থাঙ্কটি লক করার প্রয়োজন এড়াতে পারি। দ্রষ্টব্য: এটি THUNK_STATICs এর ক্ষেত্রে প্রযোজ্য নয়, যার কোনও পে-লোড নেই। দ্রষ্টব্য: আমরা এই প্যাডিং শব্দটি কেবল এসএমপি না করে সমস্ত উপায়ে রেখেছি যাতে এসএমপির জন্য আমাদের সমস্ত লাইব্রেরি পুনরায় সংকলন করতে না হয়। * / পেডলোড কোনও ইন্ডিয়ারেশনের সময় ওভাররাইট করা হয় না। ইন্ডিরেশনটি হেডারে পৃথক স্থানে লেখা হয়।
এডওয়ার্ড কেএমইটিটি

6
হ্যাঁ, তবে মনে রাখবেন এটি কেবল থানদের জন্য । এটি নির্মাণকারীদের জন্য প্রযোজ্য নয়। কোনও কাণ্ডের আকার নির্ধারণ করা যাই হোক না কেন কিছুটা কঠিন - আপনাকে নিখরচায় ভেরিয়েবলগুলি গণনা করতে হবে।
নমনোলো

4

জিএইচসি অবজেক্টের আকার নির্ণয়ের জন্য গুরুর-ডেটাসাইজ প্যাকেজটি পুনরাবৃত্তির আকারের ফাংশন সরবরাহ করে । যাহোক...

আকার গণনা করার আগে একটি আবর্জনা সংগ্রহ করা হয়, কারণ আবর্জনা সংগ্রাহকরা গাদা হাঁটা কঠিন করে তুলত।

... সুতরাং এটি প্রায়শই কল করা বাস্তব হবে না!

এছাড়াও আরও দেখুন কীভাবে জিএইচসি-র মেমরির উপাত্তের উপস্থাপনাগুলি খুঁজে পাবেন? এবং আমি কীভাবে হাস্কেলের মধ্যে কোনও ধরণের আকার নির্ধারণ করতে পারি?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.