সি ++ এর চেয়ে আরও দ্রুত জাভা হ্যাপ বরাদ্দ


13

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


আমি এই উত্তরে মন্তব্যগুলি পড়ছিলাম এবং আমি এই উদ্ধৃতিটি দেখেছি।

অবজেক্ট ইনস্ট্যান্টেশন এবং অবজেক্ট-ওরিয়েন্টেড বৈশিষ্ট্যগুলি দ্রুত ব্যবহার করার জন্য জ্বলজ্বল করছে (অনেক ক্ষেত্রে সি ++ এর চেয়ে দ্রুত) কারণ তারা প্রথম থেকেই নকশাকৃত। এবং সংগ্রহগুলি দ্রুত। এমনকি সবচেয়ে অপ্টিমাইজড সি কোডের জন্য স্ট্যান্ডার্ড জাভা এই অঞ্চলে স্ট্যান্ডার্ড সি / সি ++ মারধর করে।

একজন ব্যবহারকারী (সত্যিই উচ্চ প্রতিবেদনের সাথে আমি যুক্ত করতে পারি) সাহস করে এই দাবিটি রক্ষা করেছেন, উল্লেখ করে

  1. জাভাতে গাদা বরাদ্দকরণ সি ++ এর চেয়ে ভাল

  2. এবং জাভা সংগ্রহগুলি রক্ষা করে এই বিবৃতিটি যুক্ত করেছেন

    এবং জাভা সংগ্রহগুলি বেশিরভাগ ভিন্ন ভিন্ন মেমরি সাবসিস্টেমের কারণে সি ++ সংগ্রহের তুলনায় দ্রুত।

সুতরাং আমার প্রশ্নটি হ'ল এগুলির কোনও সত্যই সত্য হতে পারে এবং যদি তাই হয় তবে কেন জাভাটির গাদা বরাদ্দ এত দ্রুত।


আপনি অনুরূপ প্রশ্নের আমার উত্তর পেতে পারেন তাই দরকারী / প্রাসঙ্গিক।
ড্যানিয়েল প্রাইডেন

1
এটি তুচ্ছ: জাভা (বা অন্য কোনও পরিচালিত, সীমাবদ্ধ পরিবেশ) এর সাহায্যে আপনি অবজেক্টগুলিকে সরিয়ে নিতে পারেন এবং পয়েন্টারগুলিকে তাদের কাছে আপডেট করতে পারেন - অর্থাত্ গতিশীলভাবে একটি ভাল ক্যাশে লোকালটির জন্য অনুকূলিত। অনিয়ন্ত্রিত বিটকাস্ট সহ সি ++ এবং এর পয়েন্টার পাটিগণিতের সাহায্যে সমস্ত বস্তু চিরতরে তাদের অবস্থানে পিন হয়ে যায়।
এসকে-যুক্তি

3
আমি কখনই ভাবিনি যে আমি কাউকে জাভা মেমরি পরিচালনা দ্রুত বলে বলতে পারি কারণ এটি সমস্ত সময় মেমরির অনুলিপি করে। দীর্ঘশ্বাস.
gbjbaanb

1
@gbjbaanb, আপনি কি কখনও স্মৃতি শৃঙ্খলার কথা শুনেছেন? ক্যাশে পেনাল্টি মিস? আপনি কি বুঝতে পেরেছেন যে একটি সাধারণ উদ্দেশ্য বরাদ্দ ব্যয়বহুল, যখন প্রথম প্রজন্মের বরাদ্দ কেবল একটি সংযোজন অপারেশন?
এসকে-যুক্তি

1
যদিও এটি কিছু ক্ষেত্রে কিছুটা সত্য হতে পারে তবে এটি এই বিন্দুটি মিস করে যে জাভাতে আপনি সমস্ত কিছু গাদা এবং সি ++ এ বরাদ্দ করেন স্ট্যাকের উপরে আপনি প্রচুর পরিমাণে অবজেক্ট বরাদ্দ করেন যা এখনও খুব দ্রুত হতে পারে।
জনবি

উত্তর:


23

এটি একটি আকর্ষণীয় প্রশ্ন এবং উত্তরটি জটিল।

সামগ্রিকভাবে, আমি বলেছি যে জেভিএম আবর্জনা সংগ্রাহক খুব সুন্দরভাবে ডিজাইন করেছেন এবং অত্যন্ত দক্ষ fair এটি সম্ভবত সেরা সাধারণ উদ্দেশ্যে মেমরি পরিচালনা সিস্টেম।

সি ++ নির্দিষ্ট উদ্দেশ্যে তৈরি করা বিশেষ মেমরির বরাদ্দকারীদের সাথে জেভিএম জিসিকে পরাজিত করতে পারে । উদাহরণগুলি হ'ল:

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

বিশেষী মেমরি বরাদ্দকারীরা অবশ্যই সংজ্ঞা দ্বারা সীমাবদ্ধ। তাদের সাধারণত বস্তুর জীবনচক্রের উপর বাধা বা / বা পরিচালনা করা যায় এমন বস্তুর ধরণের বিধিনিষেধ থাকে। আবর্জনা সংগ্রহ অনেক বেশি নমনীয়।

আবর্জনা সংগ্রহ আপনাকে পারফরম্যান্স দৃষ্টিকোণ থেকে কিছু উল্লেখযোগ্য সুবিধা দেয় :

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

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


সি ++ এরিয়ায় বিশেষায়িত গ্রন্থাগার রয়েছে যা সেই সমস্যাটির সমাধান করে। এর জন্য সম্ভবত সবচেয়ে বিখ্যাত উদাহরণ হ'ল স্মার্টহীপ।
টোবিয়াস ল্যাঙ্গনার

5
সফট-রিয়েলটাইমের অর্থ এই নয় যে আপনি সাধারণত বন্ধ হয়ে যান । এর অর্থ হ'ল আপনি থামাতে / পুনরায় চেষ্টা করতে পারেন সত্যিকারের খারাপ পরিস্থিতিতে - সাধারণত অপ্রত্যাশিত - থামার / ক্র্যাশ / ব্যর্থতার পরিবর্তে। কেউ সাধারণত সঙ্গীত প্লেয়ারকে বিরতি দিতে ব্যবহার করতে চান না। জিসি বিরামের সমস্যাটি হ'ল এটি সাধারণত এবং অবিশ্বাস্যভাবে ঘটে । সেই পদ্ধতিতে, নরম-রিয়েলটাইম অ্যাপ্লিকেশনের জন্যও জিসি বিরতি গ্রহণযোগ্য নয়। জিসি বিরতি কেবল তখনই গ্রহণযোগ্য হয় যখন ব্যবহারকারীরা অ্যাপ্লিকেশন মানের যত্ন না করে। এবং আজকাল, লোকেরা আর এতটা নিষ্পাপ হয় না।
ইওনিল

1
আপনার দাবিগুলি সমর্থন করার জন্য দয়া করে কিছু কর্মক্ষমতা পরিমাপ পোস্ট করুন, অন্যথায় আমরা আপেল এবং কমলা তুলনা করছি।
জেবিআরউইলকিনসন

1
@ ডিমেট্রি তবে বাস্তবে, যদি আপনি কিছু অবৈজ্ঞানিক বাধা মেটাতে না পারেন তবেই যদি মামলা খুব বেশি ঘটে (এবং আবারও, অপ্রত্যাশিতভাবে!) অন্য কথায়, রিয়েলটাইমের যে কোনও পরিস্থিতির জন্য সি ++ অনেক সহজ।
ইওনিল

1
সম্পূর্ণতার জন্য: জিসি পারফরম্যান্স-ভিত্তিতে আরও একটি নেতিবাচকতা রয়েছে: সর্বাধিক-বিদ্যমান-জিসি যেমন মুক্তির মেমরি অন্য থ্রেডে ঘটে যা সম্ভবত অন্য কোনও কোরতে চালিত হয়, এর অর্থ হ'ল জিসিগুলি সিঙ্ক করার জন্য গুরুতর ক্যাশে অবৈধকরণ ব্যয় বহন করছে বিভিন্ন কোরের মধ্যে এল 1 / এল 2 ক্যাশে; তদ্ব্যতীত, সার্ভারগুলিতে যা প্রধানত NUMA হয়, L3 ক্যাশেগুলিও সিঙ্ক্রোনাইজ করতে হয় (এবং হাইপারট্রান্সপোর্ট / কিউপিআই এর বাইরে, আউট (!))।
নো-বাগস হরে

3

এটি কোনও বৈজ্ঞানিক দাবি নয়। আমি এই বিষয়টিতে কেবল চিন্তার জন্য কিছু খাবার দিচ্ছি।

একটি ভিজ্যুয়াল উপমাটি হ'ল: আপনাকে একটি অ্যাপার্টমেন্ট দেওয়া হয়েছে (আবাসিক ইউনিট) যা কার্পেট করা। গালিচা নোংরা। অ্যাপার্টমেন্টের মেঝেটি ঝলকানি পরিষ্কার করার দ্রুততম উপায় (ঘন্টাগুলির নিরিখে) কী?

উত্তর: কেবল পুরানো কার্পেট রোল আপ; ফেলে দেওয়া; এবং একটি নতুন কার্পেট রোল আউট।

আমরা এখানে কি অবহেলা করছি?

  • বিদ্যমান ব্যক্তিগত জিনিসপত্র বাইরে নিয়ে যাওয়ার এবং পরে প্রবেশের ব্যয়।
    • এটি আবর্জনা সংগ্রহের ব্যয় "স্টপ-দ্য ওয়ার্ল্ড" হিসাবে পরিচিত।
  • নতুন কার্পেটের দাম।
    • যা, কাকতালীয়ভাবে র‌্যামের জন্য এটি নিখরচায়।

আবর্জনা সংগ্রহ একটি বিশাল বিষয় এবং প্রোগ্রামার্স.এসই এবং স্ট্যাকওভারফ্লো উভয়েই প্রচুর প্রশ্ন রয়েছে।

একদিকে ইস্যুতে রেফারেন্স গণনা সহ টিসিমলোক নামে পরিচিত একটি সি / সি ++ বরাদ্দ ব্যবস্থাপক তাত্ত্বিকভাবে যে কোনও জিসি সিস্টেমের সেরা পারফরম্যান্স দাবী পূরণ করতে সক্ষম।


আসলে সি ++ 11 এমনকি একটি আবর্জনা সংগ্রহের এবিআই রয়েছে , এটি এসও
অ্যারোনম্যান

এটি বিদ্যমান সি / সি ++ প্রোগ্রাম (লিনাক্স কার্নেলগুলির মতো কোড বেসগুলি এবং প্রত্নতাত্ত্বিক_স্তাদী_স্তম্ভবাদী_প্রেমী যেমন লাইবটিফ) ভাঙ্গার ভয় যা সি ++ এ ভাষা উদ্ভাবনের অগ্রগতিকে বাধা দেয়।
রোবং

বোঝায়, আমি সি ++ 17 দ্বারা অনুমান করব এটি আরও সম্পূর্ণ হবে, তবে সত্যটি একবার আপনি যখন সি ++ তে প্রোগ্রাম করতে শিখেন তখন আপনি এটি আর চান না, সম্ভবত তারা দুটি আইডিয়মের সংমিশ্রনের একটি উপায় খুঁজে পেতে পারেন সুন্দরভাবে
অ্যারোনম্যান

আপনি কি বুঝতে পারেন যে এমন জঞ্জাল সংগ্রহকারী রয়েছে যা বিশ্বকে থামায় না? আপনি কি কমপ্লেটিফিকেশন (জিসি সাইডে) এবং হিপ ফ্র্যাগমেন্টেশন (জেনেরিক সি ++ বরাদ্দকারীদের) এর কর্মক্ষমতা সম্পর্কে বিবেচনা করেছেন?
এসকে-যুক্তি

2
আমি মনে করি এই উপমাটির মূল ত্রুটিটি হ'ল জিসি আসলে যা করেন তা হ'ল নোংরা বিটগুলি খুঁজে বের করা, তাদের কেটে ফেলা এবং তারপরে অবশিষ্ট বিটগুলি একসাথে একটি নতুন কার্পেট তৈরি করতে দেখেছি।
এসভিউ

3

মূল কারণটি হ'ল, আপনি যখন জাভাটিকে একটি নতুন গলার স্মৃতি জিজ্ঞাসা করবেন, তখন এটি সরাসরি স্তূপের শেষে চলে যায় এবং আপনাকে একটি ব্লক দেয়। এইভাবে, মেমরির বরাদ্দ স্ট্যাকের জন্য বরাদ্দের তত দ্রুত (এটি আপনি সি / সি ++ এ বেশিরভাগ সময় কীভাবে করেন তবে এটি ব্যতীত ..)

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

এটি জাভা / .NET বেঞ্চমার্কগুলিতে যেমন ভাল পারফরম্যান্স দেখায় তার এক কারণ, তবুও বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলি যেমন খারাপ কার্য সম্পাদন দেখায়। আমাকে কেবল আমার ফোনের অ্যাপ্লিকেশনগুলি দেখতে হবে - সত্যিই দ্রুত, প্রতিক্রিয়াশীল এগুলি সমস্ত এনডিকে ব্যবহার করে লেখা হয়, তাই আমি অবাক হয়ে গিয়েছিলাম।

স্থানীয়ভাবে সমস্ত বস্তু বরাদ্দ করা হয়, যেমন একটি একক নিয়মিত ব্লকে, আজকাল সংগ্রহগুলি দ্রুত হতে পারে। এখন, জাভাতে, আপনি কেবল সংকীর্ণ ব্লকগুলি পাবেন না কারণ গাদা থেকে মুক্ত প্রান্ত থেকে একসাথে অবজেক্টগুলি বরাদ্দ করা হয়। আপনি তাদের সাথে আনন্দের সাথে সংঘবদ্ধ হতে পারেন তবে কেবল ভাগ্য দ্বারা (অর্থাত্ জিসি সংযোগের রুটিনগুলি এবং এটি কীভাবে বস্তুগুলি অনুলিপি করে) to অন্যদিকে সি / সি ++ স্পষ্টভাবে সংক্ষিপ্ত বরাদ্দকে সমর্থন করে (স্পষ্টতই স্ট্যাকের মাধ্যমে)। সাধারণত সি / সি ++ এ অবধি বস্তুগুলি জাভার বিটিডাব্লু থেকে আলাদা নয়।

এখন সি / সি ++ এর সাহায্যে আপনি ডিফল্ট বরাদ্দকারীদের থেকে আরও ভাল পেতে পারেন যা মেমরি সংরক্ষণ এবং এটি দক্ষতার সাথে ব্যবহারের জন্য ডিজাইন করা হয়েছিল। আপনি বরাদ্দকারীকে স্থির-ব্লক পুলের একটি সেট দিয়ে প্রতিস্থাপন করতে পারেন, যাতে আপনি সর্বদা একটি ব্লক খুঁজে পেতে পারেন যা আপনি বরাদ্দ করছেন এমন অবজেক্টের জন্য সঠিক আকার is ফ্রি ব্লকটি কোথায় আছে তা দেখার জন্য গাদা হাঁটা বিটম্যাপ দেখার বিষয়টি হয়ে যায় এবং ডি-বরাদ্দ কেবল সেই বিটম্যাপে কিছুটা পুনরায় সেট করে। ব্যয়টি হ'ল স্থির আকারের ব্লকগুলিতে বরাদ্দ দেওয়ার সাথে সাথে আপনি আরও মেমরি ব্যবহার করেন, সুতরাং আপনার কাছে 4 বাইট ব্লকের একটি গাদা আছে, অন্য 16 টি বাইট ব্লকের জন্য etc.


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

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

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

3
আমি আপনার দাবির সাথে একমত নই যে গাদা বরাদ্দ 'স্ট্যাকের মতো দ্রুত' - গাদা বরাদ্দকরণের জন্য থ্রেড সিঙ্ক্রোনাইজেশন প্রয়োজন এবং স্ট্যাকের (সংজ্ঞা অনুসারে) প্রয়োজন নেই
জেবিআর উইলকিনসন

1
আমার ধারণা তাই, তবে জাভা এবং। নেট এর সাথে আপনি আমার বক্তব্যটি দেখতে পাচ্ছেন - পরের ফ্রি ব্লকটি সন্ধান করতে আপনাকে গাদা হাঁটা লাগবে না, তবে এটির ক্ষেত্রে এটির তাত্পর্য দ্রুত, তবে হ্যাঁ - আপনি ঠিক বলেছেন, এটি হতে হবে লকড যা থ্রেডেড অ্যাপ্লিকেশনগুলিকে ক্ষতি করবে।
gbjbaanb

2

ইডেন স্পেস

সুতরাং আমার প্রশ্নটি হ'ল এগুলির কোনও সত্যই সত্য হতে পারে এবং যদি তাই হয় তবে কেন জাভাটির গাদা বরাদ্দ এত দ্রুত।

জাভা জিসি কীভাবে কাজ করে তা সম্পর্কে আমি কিছুটা অধ্যয়ন করছি যেহেতু এটি আমার কাছে খুব আকর্ষণীয়। আমি সর্বদা আমার সি এবং সি ++ (সিতে অনুরূপ কিছু বাস্তবায়নের চেষ্টা করতে আগ্রহী) এর মেমরি বরাদ্দ কৌশলগুলির সংগ্রহটি প্রসারিত করার চেষ্টা করছি এবং এটি থেকে একটি ফেটে ফ্যাশনে প্রচুর পরিমাণে বরাদ্দ করা খুব দ্রুত উপায় a ব্যবহারিক দৃষ্টিভঙ্গি তবে মূলত মাল্টিথ্রেডিংয়ের কারণে।

জাভা জিসি বরাদ্দ যেভাবে কাজ করে তা হ'ল প্রাথমিকভাবে "ইডেন" স্পেসে অবজেক্টগুলিকে বরাদ্দ দেওয়ার জন্য অত্যন্ত সস্তা বরাদ্দ কৌশলটি ব্যবহার করা। আমি যা বলতে পারি তা থেকে এটি ক্রমানুসারে পুল বরাদ্দকারী ব্যবহার করে।

এটি পুরোপুরি দ্রুতগতির ক্ষেত্রে mallocসি বা ডিফল্টের সাধারণ উদ্দেশ্যগুলির চেয়ে operator newসি ++ এ ছুঁয়ে ফেলার জন্য বাধ্যতামূলক পৃষ্ঠা ত্রুটিগুলি হ্রাস করার ক্ষেত্রে এবং গতিরোধের দিক থেকে অনেক দ্রুত

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

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

সংগ্রহ

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

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

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

একবার ইডেন স্পেসের বাইরে মেমোরি অনুলিপি করা হয় এবং এই আরও ব্যয়বহুল স্কিম ব্যবহার করে বরাদ্দ দেওয়া হয় যা প্রাথমিক জিসি চক্রের পরে পৃথক অংশগুলি মুক্ত করতে পারে, বস্তুগুলি আরও ধ্রুবক স্মৃতি অঞ্চলে চলে যায়। Individual স্বতন্ত্র অংশগুলি পরে জিসি চক্রগুলিতে রেফারেন্স হওয়া বন্ধ করে দিলে তারা মুক্ত হয়।

গতি

সুতরাং, অদ্ভুতভাবে বলতে গেলে, জাভা জিসি খুব সহজেই সি বা সি ++ ছাড়িয়ে যাওয়ার সরাসরি কারণ হতে পারে কারণ এটি মেমরি বরাদ্দের অনুরোধ করে থ্রেডের মধ্যে সস্তার, সম্পূর্ণ অবক্ষয়যুক্ত বরাদ্দ কৌশলটি ব্যবহার করছে। তারপরে এটি আরও বেশি ব্যয়বহুল কাজ সাশ্রয় করে যা সাধারণত যখন আমাদের mallocঅন্য থ্রেডের জন্য স্ট্রেট-আপ এর মতো সাধারণ জলাধার ব্যবহার করে তখন সাধারণত আমাদের প্রয়োজন হয় to

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

এটিই মূল পার্থক্য এবং জাভা কেন খুব সহজেই সি বা সি ++ ছাড়িয়ে কেবলমাত্র নিখুঁত কলগুলি ব্যবহার করে mallocবা operator newস্বতন্ত্রভাবে কিশোর খণ্ডগুলির জন্য একগুচ্ছ বরাদ্দ করতে পারে। অবশ্যই কিছুটা পারমাণবিক অপারেশন এবং কিছু সম্ভাব্য লকিং যখন জিসি চক্রটি চালু হয়, তবে এটি সম্ভবত বেশ কিছুটা অনুকূলিত হয়েছে।

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

সর্বশেষে তবে সর্বনিম্ন নয়, তুলনাটি কিছুটা অন্যায় কারণ সি ++ কোড সাধারণত গাদাতে পৃথকভাবে অবজেক্টগুলির একটি নৌকা বোঝা বরাদ্দ করে না। শালীন সি ++ কোড মঞ্জুরিযুক্ত ব্লক বা স্ট্যাকের অনেক উপাদানগুলির জন্য মেমরি বরাদ্দ করে to যদি এটি ফ্রি স্টোরটিতে একসাথে ক্ষুদ্র বস্তুগুলির একটি বোতল লোড বরাদ্দ করে, কোডটি শিট করা হয়।


0

এগুলি নির্ভর করে যে গতি কে পরিমাপ করে, প্রয়োগের গতি তারা কী পরিমাপ করে এবং তারা কী প্রমাণ করতে চায় depends এবং তারা কি তুলনা।

আপনি যদি কেবলমাত্র বরাদ্দ / ডিলোকেটিংয়ের দিকে নজর দেন, সি ++ এ আপনার কাছে ম্যালোকের কাছে 1,000,000 কল এবং বিনামূল্যে () তে 1,000,000 কল থাকতে পারে। জাভাতে, আপনার কাছে নতুন () -এর জন্য 1,000,000 কল এবং কোনও আবর্জনা সংগ্রহকারী লুপে চলতে থাকা 1,000,000 অবজেক্টগুলি এটি মুক্ত করতে পারে। লুপটি ফ্রি () কলের চেয়ে দ্রুততর হতে পারে।

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

তৃতীয়দিকে, রেফারেন্স গণনার মতো জিনিস রয়েছে যা আবর্জনা সংগ্রহ ছাড়াই আপনার প্রয়োজন হতে পারে এবং এটি নিখরচায় আসে না।

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