মেমোরি ব্যবহার বিশ্লেষণ: জাভা বনাম সি ++ অবহেলিত?


9

জাভাতে লেখা একটি পূর্ণসংখ্যার অবজেক্টের মেমরি ব্যবহার কীভাবে সি ++ তে লিখিত পূর্ণসংখ্যার মেমরির ব্যবহারের সাথে বিপরীত হয়? পার্থক্য কি নগণ্য? কোনও পার্থক্য নেই? বড় পার্থক্য? আমি অনুমান করছি এটি একই রকম কারণ ভাষাটি (?) নির্বিশেষে কোনও অন্তর্নিহিত

আমি কেন এটি জিজ্ঞাসা করার কারণটি হ'ল কারণ যখন আমি কোনও প্রোগ্রামের মেমরির প্রয়োজনীয়তা প্রোগ্রামারকে প্রদত্ত কোনও সমস্যা সমাধান করতে বাধা দেবে তখন তা জানার গুরুত্ব সম্পর্কে পড়ছিলাম

আমাকে যা মুগ্ধ করেছে তা হ'ল একক জাভা অবজেক্ট তৈরির জন্য প্রয়োজনীয় মেমরি। উদাহরণস্বরূপ, একটি পূর্ণসংখ্যার অবজেক্টটি ধরুন। আমি ভুল হলে আমাকে সংশোধন করুন তবে জাভা ইন্টিজার অবজেক্টের জন্য 24 বাইটের মেমরির প্রয়োজন:

  • এর int উদাহরণ পরিবর্তনশীল জন্য 4 বাইট
  • ওভারহেডের 16 বাইট (অবজেক্টের ক্লাসের রেফারেন্স, আবর্জনা সংগ্রহের তথ্য এবং সিঙ্ক্রোনাইজেশন তথ্য)
  • প্যাডিং 4 বাইট

অন্য উদাহরণ হিসাবে, একটি জাভা অ্যারে (যা একটি অবজেক্ট হিসাবে প্রয়োগ করা হয়) এর জন্য 48 + বাইট প্রয়োজন:

  • হেডার তথ্য 24 বাইট
  • ওভারহেডের 16 বাইট
  • দৈর্ঘ্যের জন্য 4 বাইট
  • প্যাডিং জন্য 4 বাইট
  • মানগুলি সঞ্চয় করার জন্য মেমরির অতিরিক্ত

এই মেমরিটি কীভাবে সি ++ তে লেখা একই কোডের সাথে তুলনা করে?

আমি যে সি ++ এবং জাভা প্রোগ্রামগুলি লিখেছিলাম সেগুলির মেমরির ব্যবহার সম্পর্কে আমি সচেতন ছিলাম না, তবে এখন আমি যখন অ্যালগরিদমগুলি সম্পর্কে শিখতে শুরু করি তখন কম্পিউটারের সংস্থানগুলির জন্য আমার আরও বেশি প্রশংসা হচ্ছে।


6
সি ++ তে একটি "পূর্ণসংখ্যার অবজেক্ট" কী? int? যদি তা হয় তবে আপনার intজাভাতে এটি তুলনা করা উচিত , Integerযতক্ষণ না আপনার সি ++ ইনটগুলি 32 বিট হয়।
মাদুর

+1 যদি আমি একটি সি ++ ক্লাস তৈরি করেছিলাম যার কেবলমাত্র একটি ইন্ট ভেরিয়েবল ছিল, তবে তা ইনস্ট্যান্ট করে দিয়েছি
অ্যান্থনি

3
কোন int না কোন int - এটা প্ল্যাটফর্ম নির্ভরশীল

1
কেবলমাত্র একজন ইনট সদস্য সহ একটি সি ++ এর সাধারণত কোনও ওভারহেড থাকে না। এটি প্ল্যাটফর্মটি কোনও int সংরক্ষণের জন্য ঠিক একই স্থান ব্যবহার করবে (সাধারণত পিসি প্ল্যাটফর্মগুলিতে 4 বাইট)।
ডার্ক হোলসোপ্পল

একটি জাভা প্রোগ্রামার মেমরি সম্পর্কে কৌতূহলশীল জন্য +1। অন্য যে কোনও কিছুর চেয়েও বেশি, মেমোরি সচেতনতা আধুনিক স্থাপত্যগুলির উপর পারফরম্যান্স নির্ধারণের জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়।
imallett

উত্তর:


15

এটি প্ল্যাটফর্ম এবং বাস্তবায়নের উপর নির্ভর করে।

সি ++ গ্যারান্টি দেয় যে আকারটি charহ'ল এক বাইট এবং কমপক্ষে 8 বিট প্রস্থ। তারপরে, ক এর আকার short intকমপক্ষে 16 বিট এবং এর চেয়ে ছোট নয় char। একটি এর আকার intকমপক্ষে আকারের হিসাবে বড় short int। আকার long intকমপক্ষে 32 বিট এবং ইনট থেকে ছোট নয়।

sizeof(char) == 1; sizeof(long int) >= sizeof(int) >= sizeof(short int) >= sizeof(bool) >= sizeof(char).

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

স্পষ্টতই, জাভা মেমরির ব্যবহারটি কোডটি চালানো কোডের চেয়ে জাভা প্রয়োগের উপর বেশি নির্ভর করে কারণ এ জাতীয় তুলনাটি নিখুঁত।


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

ওপিতে দ্রষ্টব্য: আপনি নিজের পূর্ণসংখ্যার আকারটি বেছে নেওয়ার চেয়ে ভাল হতে পারেন - আপনি যদি সি ++ তে 32-বিট ইন্টি চান, আপনি ব্যবহার করতে পারেন int32_t
কে.স্টেফ

9

বেশিরভাগ উত্তরগুলি বেশ কয়েকটি মোটামুটি প্রধান বিষয়গুলিকে উপেক্ষা করছে বলে মনে হচ্ছে।

প্রথমত, জাভা একটি ভয়াবহ অনেক, আপনি কার্যত একটি কাঁচা কখনই দেখতে int- প্রায় সব ব্যবহার করা হয় Integer, তাই সত্য একটি যে int(প্রায়) একজন হিসাবে একই আকার হতে পারে intC অথবা C ++ হয় প্রায় অপ্রাসঙ্গিক, যে জন্য ব্যতীত ( আমার অভিজ্ঞতায়, সামান্য) কোডের শতাংশ যা কেবল intতার পরিবর্তে ব্যবহার করে Integer

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

এই মুহুর্তে আমার কাছে কোনও লিঙ্কটি কার্যকর নেই, তবে কিছু পরীক্ষা হয়েছে যা দেখিয়েছে যে জাভা সি-এর মতো একই গতিতে চলতে পারে তবে এটি করার জন্য আপনাকে জিসি খুব কমই চালাতে হবে যা এটি প্রায় 7 গুণ বেশি ব্যবহার করে স্মৃতি. এর কারণ নয় যে স্বতন্ত্র বস্তুগুলি as গুণ বড় হয়, তবে আপনি খুব ঘন ঘন এটি করলে জিসি বেশ ব্যয়বহুল হয়ে উঠতে পারে। সবচেয়ে খারাপ বিষয়, জিসি কেবল তখনই মেমরি ছেড়ে দিতে পারে যখন এটি "প্রমাণ" করতে পারে যে কোনও জিনিস অ্যাক্সেসের আর কোনও উপায় নেই, বরং আপনি যখন জানেন যে আপনি এটি ব্যবহার করেছেন কাজ করে। এর অর্থ এই যে আপনি মেমরির ব্যবহার কমাতে অনেক বেশি সময় ধরে জিসি চালান, আপনি সম্ভবত এখনও কোনও সাধারণ প্রোগ্রামে পরিকল্পনা করতে পারেন যে মেমোরির পদাঙ্কটি আরও বড়। এই জাতীয় ক্ষেত্রে, আপনি ফ্যাক্টরটি 7 এর পরিবর্তে 2 বা 3 এ কমিয়ে দিতে পারেন যদিও আপনি খুব বেশি করে ওভারবোর্ডে যান তবে ডন '

পরিস্থিতির উপর নির্ভর করে, আরও একটি কারণ রয়েছে যা উল্লেখযোগ্য বা নাও হতে পারে: নিজেই জেভিএম দ্বারা দখল করা স্মৃতি। এটি কম বা কম স্থির করা হয়েছে, সুতরাং অ্যাপ্লিকেশনটির নিজস্ব সঞ্চয়স্থানের প্রয়োজন না হলে শতাংশ হিসাবে এটি বিশাল হতে পারে, বা অ্যাপটিকে প্রচুর পরিমাণে সঞ্চয় করার প্রয়োজন হলে এটি সংক্ষিপ্ত হতে পারে। কমপক্ষে আমার মেশিনে, এমনকি অতি তুচ্ছ জাভা অ্যাপ্লিকেশনটি 20-25 মেগাবাইটের মতো (ত্রিভালাল প্রোগ্রামগুলির জন্য 1000x এর বেশি হতে পারে, বা বড়দের জন্য প্রায় অদম্য ক্ষুদ্র) হতে পারে বলে মনে হয়।


1 এটি বলার অপেক্ষা রাখে না যে আপনি সি ++ এর সাথে যা চান তার কাছাকাছি এমন একটি পায়ের ছাপ দিয়ে জাভা লিখতে সম্ভবত কেউ পরিচালনা করতে পারে না। কেবলমাত্র এটি বলার জন্য যে কেবলমাত্র একই সংখ্যা / আকারের অবজেক্ট রয়েছে এবং জিসি চালানো সত্যিই ঘন ঘন একটি নিয়ম হিসাবে আপনি পাবেন না।


7
আপনার প্রথম বিষয় সম্পর্কে: আমি জাভা লোক নই, তবে আমি যে জাভা এপিআইগুলি দেখেছি Integerসেগুলি এর পরিবর্তে কখনও ব্যবহার করা হয়নি (কেন তারা করবে?) intIntegerটাইপ ইরেজরের কারণে কেবল জেনেরিক সংগ্রহের কোনও বিকল্প নেই , তবে আপনি যদি যত্নশীল হন তবে বিশেষায়িত বাস্তবায়ন intবা আপনার যে কোনও প্রকারের আদিম ধরণের প্রয়োজন তা প্রতিস্থাপন করতে পারেন । এবং তারপরে জেনেরিক মোড়ানোর কোডটি পাস করার জন্য অস্থায়ী বক্সিং রয়েছে (যেমন সমস্ত কিছু যা একটি প্রয়োজন Object[])। তা ছাড়া, আপনার কাছে কি জিসি স্পেস ওভারহেডের উত্স আছে? আমি সত্যিই এটি সন্দেহ করি না, আমি নিছক কৌতূহলী।

3
@ ডেলানন: সিএস.ক্যানিসিয়াস.ইডু/ ~
জেরি কফিন

9

আমি আশা করি আপনি বুঝতে পেরেছেন যে এগুলি সব জাভা এবং সি ++ উভয়ের জন্যই গভীরভাবে বাস্তবায়ন-সংজ্ঞায়িত। বলা হচ্ছে, জাভার অবজেক্ট মডেলটিতে বেশ খানিকটা জায়গা প্রয়োজন।

সি ++ অবজেক্টের (সাধারণভাবে) সদস্যদের প্রয়োজন ব্যতীত কোনও স্টোরেজ প্রয়োজন হয় না। নোট করুন (জাভা থেকে পৃথক, যেখানে ব্যবহারকারী-সংজ্ঞায়িত সমস্ত কিছুই একটি রেফারেন্স টাইপ), ক্লায়েন্ট কোড কোনও বস্তুকে মান প্রকার বা রেফারেন্স ধরণের হিসাবে ব্যবহার করতে পারে, অর্থাত্ কোনও বস্তু অন্য বস্তুর জন্য পয়েন্টার / রেফারেন্স সংরক্ষণ করতে পারে, বা সরাসরি বস্তুকে সঞ্চয় করতে পারে ইন্ডিয়ারেশন ছাড়াই যদি কোনও virtualপদ্ধতি থাকে তবে অবজেক্টের জন্য অতিরিক্ত অতিরিক্ত পয়েন্টার প্রয়োজন , তবে পলিমারফিজম ছাড়াই বেশ কয়েকটি দরকারী ক্লাস তৈরি করা হয়েছে এবং এটির প্রয়োজন নেই। কোনও জিসি মেটাডেটা নেই এবং প্রতি-বস্তুর লক নেই। সুতরাং class IntWrapper { int x; public: IntWrapper(int); ... };অবজেক্টগুলির জন্য প্লেইন intএসের চেয়ে বেশি স্থানের প্রয়োজন নেই এবং সংগ্রহ এবং অন্যান্য অবজেক্টগুলিতে সরাসরি (অর্থাত্‍ নির্দেশনা ছাড়াই) স্থাপন করা যায়।

অ্যারেগুলি জটিল কারণ কেবল সি ++ তে জাভা অ্যারের সমতুল্য কোনও প্রাক-তৈরি, সাধারণ সমতুল্য নেই। আপনি কেবলমাত্র একগুচ্ছ অবজেক্টগুলি বরাদ্দ করতে পারবেন new[](একেবারে কোনও ওভারহেড / মেটাডেটা ছাড়াই) তবে দৈর্ঘ্যের কোনও ক্ষেত্র নেই - বাস্তবায়ন সম্ভবত একটি সঞ্চয় করে তবে আপনি এটি অ্যাক্সেস করতে পারবেন না। std::vectorএকটি গতিশীল অ্যারে এবং এর ফলে অতিরিক্ত ওভারহেড এবং আরও বড় ইন্টারফেস রয়েছে। std::arrayএবং সি-স্টাইল অ্যারে (int arr[N];), একটি সংকলন-সময় ধ্রুবক প্রয়োজন। তত্ত্বের ক্ষেত্রে, এটি কেবলমাত্র অবজেক্টের স্টোরেজ প্লাস দৈর্ঘ্যের জন্য একটি একক পূর্ণসংখ্যার হওয়া উচিত - তবে যেহেতু আপনি গতিশীল আকার পরিবর্তন করতে এবং খুব অল্প অতিরিক্ত জায়গার সাথে একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত ইন্টারফেস পেতে পারেন, তাই আপনি কেবল অনুশীলনে যান। মনে রাখবেন যে এগুলি এবং সেই সাথে সমস্ত অন্যান্য সংগ্রহগুলি মূল্য দ্বারা অবজেক্টগুলি সঞ্চয় করার জন্য ডিফল্ট, এইভাবে আপনার নির্দেশনা এবং রেফারেন্সের স্থান সংরক্ষণ করে এবং ক্যাশে আচরণের উন্নতি করে। ইন্ডিয়ারেশন পাওয়ার জন্য আপনাকে অবশ্যই পয়েন্টার (স্মার্ট ওয়ানস, প্লিজ) অবশ্যই সঞ্চয় করতে হবে।

উপরের তুলনাগুলি পুরোপুরি ন্যায্য নয়, কারণ এর মধ্যে কিছু সঞ্চয় জাভা অন্তর্ভুক্ত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত না করে সরবরাহ করা হয় এবং তাদের সি ++ সমতুল্য প্রায়শই জাভা সমমানের (*) এর চেয়ে কম অপ্টিমাইজড হয়। সাধারণ উপায় বাস্তবায়ন virtualঠিক সাধারণ উপায় বাস্তবায়ন যতটা ওভারহেড যেমন সি ++ চাপিয়ে মধ্যে virtualজাভা। একটি লক পেতে, আপনার একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত মুটেক্স অবজেক্টের প্রয়োজন, যা সম্ভবত কয়েকটি বিটের চেয়ে বড়। রেফারেন্স গণনা পেতে ( নাজিসির সমতুল্য, এবং এটি হিসাবে ব্যবহার করা উচিত নয়, তবে কখনও কখনও দরকারী), আপনার একটি স্মার্ট পয়েন্টার প্রয়োজন যা একটি রেফারেন্স গণনা ক্ষেত্র যুক্ত করে। অবজেক্টটি সাবধানতার সাথে নির্মিত না হলে রেফারেন্স গণনা, স্মার্ট পয়েন্টার অবজেক্ট এবং রেফারেন্স করা অবজেক্ট সম্পূর্ণ পৃথক স্থানে থাকে এবং আপনি যখন এটি সঠিকভাবে নির্মাণ করেন তখনও ভাগ করে নেওয়া পয়েন্টার (অবশ্যই?) একটির পরিবর্তে দুটি পয়েন্টার হতে পারে। তারপরে, ভাল সি ++ শৈলী এই বৈশিষ্ট্যগুলির পক্ষে এটি যথেষ্ট পরিমাণে ব্যবহার করে না - বাস্তবে, একটি লিখিত সি ++ গ্রন্থাগারের বস্তু কম ব্যবহার করে। এটি অগত্যা সামগ্রিকভাবে কম মেমরির ব্যবহার বোঝায় না , তবে এর অর্থ এই যে সি ++ এর ক্ষেত্রে এই বিষয়ে ভাল শুরু হয়।

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


3

intজাভাতে একটি সমতল , intসি ++ এর মতো ঠিক স্থান নেয় , তবে উভয় বাস্তবায়ন একই ধরণের পূর্ণসংখ্যার আকার এবং মেমরির প্রান্তিককরণ ব্যবহার করে।

একটি int 'অবজেক্ট' (একটি বক্সযুক্ত পূর্ণসংখ্যা, যা শ্রেণীর উদাহরণ Integer), জাভাতে একটি শ্রেণীর উদাহরণের সমস্ত ওভারহেড বহন করে, তাই এটি intসি ++ এর চেয়ে উল্লেখযোগ্য পরিমাণে বড় । যাইহোক, আপনি যদি জাভা অবজেক্টগুলি অফ-অফ-বক্স (পলিমারফিজম, বক্সিং, আবর্জনা সংগ্রহ, আরটিটিআই) এর সাথে একই বৈশিষ্ট্যগুলি সমেত সি ++ তে সজ্জিত করেন তবে আপনি সম্ভবত সমান বস্তুর সাথে সমাপ্ত হবেন আকার।

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

হ্যাঁ, জাভা অবজেক্টস সি ++ ক্লাসের চেয়ে ডিফল্টরূপে বেশি ওভারহেড বহন করে তবে এগুলি আরও বৈশিষ্ট্য সহ আসে এবং এর ফলে একটি ভিন্ন প্রোগ্রামিং শৈলীর দিকে পরিচালিত হয় - একটি ভাল প্রোগ্রামার উভয়েরই ভাষার উত্স এবং ডাউনসাইডকে উত্তোলন করতে পারে।


+1 জাভাতে আরও ওভারহেড তবে আরও বৈশিষ্ট্যগুলি, আমি এখন বুঝতে পারি, ধন্যবাদ
অ্যান্থনি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.