ম্যানুয়াল মেমরি পরিচালনার চেয়ে দ্রুত জঞ্জাল সংগ্রহের বিক্ষোভ


23

(নরক, আমিও আমার নিজের তাই লিখেছি) আমি অনেক জায়গায় পড়েছি যে গার্বেজ কালেকশন পারে (তাত্ত্বিকভাবে) দ্রুত ম্যানুয়াল মেমরি ব্যবস্থাপনা চেয়ে।

যাইহোক, দেখানো বলার চেয়ে অনেক বেশি শক্ত।
আমি কার্যকরভাবে এই প্রভাবটি প্রদর্শন করে এমন কোনও কোডের টুকরোটি আসলে দেখিনি

এই পারফরম্যান্স সুবিধাটি প্রদর্শন করে এমন কি এমন কি কোড আছে (বা আমি কোথায় জানতে পারি) জানি?


5
জিসির সমস্যাটি হ'ল বেশিরভাগ বাস্তবায়ন নিরোধক হয় না তাই 2 রানের বিস্তৃত ফলাফল হতে পারে, তুলনা করার জন্য সঠিক ভেরিয়েবলগুলি বিচ্ছিন্ন করা শক্ত নয়
র‌্যাচেট ফ্রিক

@ratchetfreak: যদি আপনি এমন কোনও উদাহরণ জানেন যা কেবলমাত্র দ্রুত (বলতে) 70০% সময় হয় তবে তা আমার পক্ষেও ঠিক আছে। কমপক্ষে থ্রুপুটের ক্ষেত্রে, দু'টির তুলনা করার কিছু উপায় থাকতে হবে (বিলম্ব সম্ভবত সম্ভবত কাজ করবে না)।
মেহরদাদ

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

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

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

উত্তর:


26

Http://blogs.msdn.com/b/ricom/archive/2005/05/10/416151.aspx দেখুন এবং রিকো মারিয়ানি বনাম রেমন্ড চেন (মাইক্রোসফ্টে অত্যন্ত দক্ষ প্রোগ্রামার উভয়) এটি দেখার জন্য সমস্ত লিঙ্কগুলি অনুসরণ করুন । রেমন্ড ব্যবস্থাপনিতকে উন্নত করবে, রিকো পরিচালিত ব্যক্তিদের মধ্যে একই জিনিসটি অনুকূল করে তুলবে।

মূলত শূন্য অপ্টিমাইজেশান প্রচেষ্টা সহ, পরিচালিত সংস্করণগুলি ম্যানুয়ালটির চেয়ে বহুগুণ দ্রুত শুরু হয়েছিল। শেষ পর্যন্ত ম্যানুয়ালটি পরিচালিতদের পরাজিত করে তবে কেবলমাত্র এমন স্তরকে অনুকূল করে যে বেশিরভাগ প্রোগ্রামার যেতে চায় না। সমস্ত সংস্করণে, ম্যানুয়ালটির মেমরির ব্যবহারটি পরিচালিতের চেয়ে গুরুত্বপূর্ণ ছিল was


কোড সহ একটি প্রকৃত উদাহরণ উদ্ধৃত করার জন্য +1 :) যদিও সি ++ কনস্ট্রাক্ট (যেমন swap) এর যথাযথ ব্যবহার এতটা কঠিন নয় এবং সম্ভবত আপনাকে সেখানে পারফরম্যান্স- ভিত্তিতে খুব সহজেই পেয়ে যাবেন ...
মেহেরদাড

5
পারফরম্যান্সে আপনি রেমন্ড চেনকে ছাড়িয়ে যেতে সক্ষম হতে পারেন। আমি আত্মবিশ্বাসী যে অসুস্থ থাকার কারণে সে এ থেকে বের না হলে আমি পারব না, আমি অনেক বেশি বেশি কঠোর পরিশ্রম করছি এবং আমি ভাগ্যবান হয়ে উঠছি। আমি জানি না কেন তিনি যে সমাধানটি বেছে নিয়েছেন তা তিনি কেন বেছে নিলেন না। আমি নিশ্চিত যে তার এর কারণ ছিল
21

আমি এখানে রেমন্ডের কোডটি অনুলিপি করেছি এবং তুলনা করতে আমি নিজের সংস্করণটি এখানে লিখেছি । পাঠ্য ফাইল থাকা জিপ ফাইলটি এখানে । আমার কম্পিউটারে, খনিটি 14 এমএসে এবং রেমন্ডের রান 21 এমএসে চলে। যদি আমি কিছু ভুল না করি (যা সম্ভব) তবে তার 215-লাইন কোডটি আমার 48-লাইন প্রয়োগের চেয়ে 50% ধীরে ধীরে, এমনকি মেমরি-ম্যাপযুক্ত ফাইল বা কাস্টম মেমরি পুলগুলি (যা তিনি ব্যবহার করেছেন) ব্যবহার না করেই । খনি # সি সংস্করণ হিসাবে অর্ধেক দীর্ঘ। আমি কি এটি ভুল করেছি, বা আপনিও একই জিনিসটি পর্যবেক্ষণ করছেন?
মেহেরদাদ

1
@ মেহরদাদ এই ল্যাপটপে জিসিসির একটি পুরানো অনুলিপি বের করে আমি জানাতে পারি যে আপনার কোড বা তার কোনওটিই সংকলন করবে না, এটি দিয়ে কিছু করতে দিন। আমি উইন্ডোজে নেই এই বিষয়টি সম্ভবত এটি ব্যাখ্যা করে। তবে ধরা যাক আপনার নম্বর এবং কোডটি সঠিক are দশক পুরানো সংকলক এবং কম্পিউটারে কি তারা একই সম্পাদন করে? (ব্লগটি কখন লেখা হয়েছিল তা দেখুন)) সম্ভবত, সম্ভবত নাও। আসুন ধরা যাক যে তারা, তিনি (একজন সি প্রোগ্রামার হওয়ায়) সি ++ সঠিকভাবে কীভাবে ব্যবহার করতে জানেন না, ইত্যাদি we আমরা কী রেখেছি?
btilly

1
আমরা একটি যুক্তিসঙ্গত সি ++ প্রোগ্রাম রেখেছি যা পরিচালিত মেমোরিতে অনুবাদ করা যায় এবং গতি বাড়ায়। তবে যেখানে সি ++ সংস্করণটি আরও অনুকূলিত করা যায় এবং আরও গতি বাড়ানো যায়। আমরা সকলেই যে চুক্তিতে রয়েছি তা হ'ল নিয়মাবলী যা সর্বদা ঘটে যখন পরিচালিত কোডটি পরিচালনা না করা থেকে দ্রুত হয়। তবে আমাদের কাছে এখনও একটি ভাল প্রোগ্রামার থেকে যুক্তিসঙ্গত কোডের একটি দৃ concrete় উদাহরণ রয়েছে যা একটি পরিচালিত সংস্করণে দ্রুত ছিল।
btilly

5

থাম্বের নিয়মটি হ'ল কোনও নিখরচায় মধ্যাহ্নভোজন নেই।

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

জিসি হয় ম্যানুয়াল মেমরি ব্যবস্থাপনা একটি বিশেষ ক্ষেত্রে

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


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

2
1) আমাকে মন্তব্য করার জন্য নির্দিষ্ট কোডটি দেখতে হবে তবে যদি হাতের লিখিত বরাদ্দকারী / এসেম্বলারের মধ্যে বাধাগুলি দ্রুত হয় তবে হাতের লিখিত এসেম্ব্লার ব্যবহার করুন। জিসির সাথে এর কী আছে তা নিশ্চিত নয়। ২) এখানে একবার দেখুন: stackoverflow.com/a/9814654/441099 মূল বিষয়টি নয় যে কোনও নন-জিসি ভাষা আপনার জন্য লেজ পুনরাবৃত্তি নির্মূল করতে পারে। মুল বক্তব্যটি হ'ল আপনি আপনার কোডটিকে তত দ্রুত বা দ্রুত রূপান্তর করতে পারেন। কিছু নির্দিষ্ট ভাষার সংকলক স্বয়ংক্রিয়ভাবে আপনার জন্য এটি করতে পারে কিনা তা সুবিধার বিষয়। স্বল্প পরিমাণে বিমূর্ততায় আপনি যদি চান তবে সর্বদা এটি নিজে করতে পারেন।
গাই সিরটন

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

3

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

আপনি যদি এটির বিষয়ে চিন্তা করেন তবে কোনও প্রক্রিয়াতে বরাদ্দকৃত মেমরি সংগ্রহ করার সময় আবর্জনা ব্যবহার করা সেই মডেল। প্রক্রিয়াটি মরে যায়, সমস্ত স্মৃতিই আবর্জনা, আমরা শেষ করেছি we're এমনকি ব্যবহারিক ভাষায়, একটি প্রক্রিয়া যা শুরু হয়, চালিত হয়, এবং কোনও চিহ্ন ছাড়াই মারা যায় তা চিরকালের জন্য শুরু এবং চলমান একের চেয়ে বেশি কার্যকর হতে পারে।

ব্যবহারিক প্রোগ্রামগুলির জন্য, আবর্জনা সংগ্রহের সাথে ভাষায় লিখিত, আবর্জনা সংগ্রহের সুবিধা গতি নয়, সঠিকতা এবং সরলতা।


যদি কোনও কৃত্রিম উদাহরণ তৈরি করা সহজ হয় তবে আপনি কি একটি সাধারণ উদাহরণ দেখিয়ে কিছু মনে করবেন?
মেহরদাদ

1
@ মেহরদাদ তিনি একটি সহজ ব্যাখ্যা করেছেন। এমন একটি প্রোগ্রাম লিখুন যেখানে প্রস্থানের আগে জিসি সংস্করণ কোনও আবর্জনা চালাতে ব্যর্থ হয়। ম্যানুয়াল মেমরি পরিচালিত সংস্করণটি ধীর হবে কারণ এটি স্পষ্টতই ট্র্যাকিং এবং স্টাফ নিখরচায় ছিল।
btilly

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

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

3
পছন্দ করেছেন দৃশ্যপটটি হ'ল যে জিসি সংস্করণটি এমন কোনও দোরগোড়ায় আঘাত হানার আগে ঘটেনি যা এটি রান করেছিল, এটি নয় যে এটি কোনও ভিন্ন ডেটা সেটে সঠিকভাবে সম্পাদন করতে ব্যর্থ হত। এটি তুচ্ছভাবে জিসি সংস্করণের জন্য খুব ভাল হতে চলেছে, যদিও চূড়ান্ত পারফরম্যান্সের কোনও ভাল ভবিষ্যদ্বাণী নয়।
btilly 21

2

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

ফলস্বরূপ, যদি আপনার কাছে এমন কোনও ভাষা থাকে যা আবর্জনা সংগ্রহ করা হয় এবং একই সিস্টেমে ম্যানুয়ালি ম্যানেজড মেমোরির সাথে গতির তুলনা করতে পারেন তবে আপনি আবর্জনা সংগ্রহের পক্ষে সমর্থন না করার জন্য আপনাকে ওভারহেড দিতে হবে যদিও আপনি এটি ব্যবহার না করছেন।


2

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


2

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

আপনি অবশ্যই 64৪-বিট পূর্ণসংখ্যা এবং কোনও বরাদ্দ ব্যবহার করে সমস্যাটি সমাধান করার জন্য প্রোগ্রামগুলি পুনরায় লিখতে পারেন। যদিও দ্রুততর এটি অনুশীলনের পয়েন্টকে পরাভূত করবে (এটি ছিল একটি নতুন জিসি অ্যালগরিদমের পারফরম্যান্সের পূর্বাভাস দেওয়ার জন্য যা আমি সি ++ এ নির্মিত একটি প্রোটোটাইপ ব্যবহার করে কাজ করছিলাম)।

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


+1 ধন্যবাদ আমরা কোথায় বেঞ্চমার্ক কোড দেখতে এবং চালাতে পারি?
মেহরদাদ

কোডটি জায়গা সম্পর্কে ছড়িয়ে ছিটিয়ে আছে। আমি এখানে চিহ্ন-অঞ্চল সংস্করণ পোস্ট করেছি: groups.google.com/d/msg/…
জন

1
সেখানে থ্রেড নিরাপদ এবং অনিরাপদ উভয়ের জন্য ফলাফল রয়েছে।
জন হ্যারোপ

1
@ মেহরদাদ: "আপনি কি ত্রুটির সম্ভাব্য উত্সগুলি মুছে ফেলেছেন?" হ্যাঁ। ওসিএএমএল এর একটি খুব সহজ সংকলন মডেল রয়েছে যার সাথে পালানোর বিশ্লেষণের মতো কোনও অপ্টিমাইজেশন নেই। ওসিএএমএল-এর সমাপ্তির উপস্থাপনাটি আসলে সি ++ সমাধানের চেয়ে যথেষ্ট ধীরে ধীরে তাই এটি List.filterসি ++ এর মতো একটি কাস্টম ব্যবহার করা উচিত । তবে, হ্যাঁ, আপনি অবশ্যই বেশ সঠিক যে কিছু কিছু আরসি অপারেশনকে এলিটেড করা যেতে পারে। তবে, বন্যের মধ্যে আমি সবচেয়ে বড় সমস্যাটি হ'ল বড় শিল্প কোড বেসগুলিতে হাত দিয়ে এই জাতীয়করণ করার জন্য লোকদের হাতে সময় নেই।
জন হ্যারোপ

2
হ্যাঁ একেবারে. লেখার জন্য কোড লেখার জন্য অতিরিক্ত কোনও প্রচেষ্টা সি ++ এর সাথে বাধা নয়। রক্ষণাবেক্ষণ কোড হয়। এই জাতীয় ঘটনামূলক জটিলতার সাথে কোড বজায় রাখা দুঃস্বপ্ন। বেশিরভাগ শিল্প কোড বেসগুলি কোটি কোটি লাইন কোড। আপনি কেবল এটি মোকাবেলা করতে চান না। আমি লোককে সব কিছুকে রূপান্তরিত shared_ptrবাগগুলি ঠিক করার জন্য রূপান্তরিত করতে দেখেছি । কোডটি অনেক ধীর কিন্তু হেই, এখন এটি কার্যকর হয়।
জন হ্যারোপ

-1

যেমন একটি উদাহরণ অগত্যা একটি খারাপ ম্যানুয়াল মেমরি বরাদ্দকরণ স্কিম আছে।

সেরা জঞ্জাল সংগ্রহকারী হিসাবে ধরে নিন GC। এটি অভ্যন্তরীণভাবে মেমরি বরাদ্দ করার পদ্ধতি, কোন স্মৃতি মুক্ত হতে পারে তা নির্ধারণ এবং অবশেষে এটিকে মুক্ত করার পদ্ধতি রয়েছে has একসাথে এগুলি সকলের চেয়ে কম সময় নেয় GC; কিছু সময় অন্যান্য পদ্ধতিতে ব্যয় করা হয় GC

এখন একটি ম্যানুয়াল বরাদ্দকারী বিবেচনা করুন যা একই বরাদ্দ প্রক্রিয়াটি ব্যবহার করে GCএবং যার free()কলটি একই পদ্ধতি দ্বারা মেমরিটিকে মুক্ত করার জন্য কেবল সেট করে GC। এটির কোনও স্ক্যান পর্ব নেই বা এটির অন্যান্য পদ্ধতিগুলির কোনও নেই। অগত্যা এটি কম সময় নেয়।


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

@ সুপের্যাট: ব্যাচও freeসংগ্রহ করতে পারে। (এবং অবশ্যই একটি মানদণ্ড পূরণ করে সমস্ত আইটেম অপসারণ করা এখনও ও (এন), কেবলমাত্র তালিকার
ক্রমবর্ধনের কারণেই

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

@ সুপের্যাট: ঠিক আছে, প্রথম মন্তব্যে এটি আপনার শেষ বাক্য হিসাবে অবশ্যই ও (1) নয়।
এমসাল্টার্স

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