ইতিমধ্যে দুর্দান্ত উত্তর সহ এই প্রশ্নোত্তর প্রয়াত-আগত, তবে আমি বিদেশী হিসাবে স্মৃতিতে বিট এবং বাইটের নিম্ন-স্তরের অবস্থান থেকে জিনিসগুলি দেখতে অভ্যস্ত হতে চাইছিলাম।
আমি অপরিবর্তনীয় নকশাগুলি, এমনকি একটি সি দৃষ্টিকোণ থেকে এবং আজকাল আমাদের কাছে এই জন্তুগত হার্ডওয়্যারকে কার্যকরভাবে প্রোগ্রাম করার জন্য নতুন উপায়গুলি আবিষ্কার করার দৃষ্টিকোণ থেকে আমি অত্যন্ত উত্সাহিত।
ধীরে দ্রুত /
এটি জিনিসগুলিকে ধীর করে তোলে কিনা এমন প্রশ্নের উত্তর হিসাবে একটি রোবোটিক উত্তর হবে yes
। এই ধরনের খুব প্রযুক্তিগত ধারণাগত স্তরে, অপরিবর্তনীয়তা কেবল জিনিসগুলিকে ধীর করে তোলে। হার্ডওয়্যার সবচেয়ে ভাল করে যখন এটি বয়ঃসন্ধিকালে মেমরি বরাদ্দ না করে এবং কেবল পরিবর্তে বিদ্যমান মেমোরিটি সংশোধন করতে পারে (কেন আমাদের অস্থায়ী লোকালয়ের মতো ধারণা রয়েছে)।
তবুও একটি বাস্তব উত্তর maybe
। পারফরম্যান্সটি এখনও কোনও অ-তুচ্ছ কোডবেসে বেশিরভাগ ক্ষেত্রে উত্পাদনশীলতা মেট্রিক। আমরা সাধারণত বাগের বিষয়টিকে অবহেলা না করে এমনকি জাতিগত অবস্থার উপর দিয়ে ট্রিপিং করা ভয়ঙ্কর-থেকে-বজায় থাকা কোডবেসগুলি পাই না। দক্ষতা প্রায়শই কমনীয়তা এবং সরলতার ফাংশন। মাইক্রো-অপ্টিমাইজেশনের শীর্ষটি কিছুটা দ্বন্দ্ব করতে পারে তবে সেগুলি সাধারণত কোডের ক্ষুদ্রতম এবং গুরুতর অংশের জন্য সংরক্ষিত থাকে।
পরিবর্তনযোগ্য বিট এবং বাইটগুলি Trans
নিম্ন স্তরের দৃষ্টিকোণ থেকে আসছে, যদি আমরা এক্সরে ভালো ধারণা objects
এবং strings
তা অন্তরে তাই ঘোষণা, শুধু বিট এবং বিভিন্ন গতি / আকার বৈশিষ্ট্য সঙ্গে মেমরির বিভিন্ন ধরনের (গতি এবং মেমরি হার্ডওয়্যার আকার সাধারণত হচ্ছে বাইট পারস্পরিক একচেটিয়া)।
কম্পিউটারের মেমোরি হায়ারার্কি পছন্দ করে যখন আমরা বারবার একই ধরণের মেমরির উপরের ডায়াগ্রামে অ্যাক্সেস করি, যেহেতু এটি মেমরির ঘন ঘন অ্যাক্সেস হওয়া অংশটিকে মেমরির দ্রুততম আকারে রাখবে (এল 1 ক্যাশে, উদাহরণস্বরূপ, যা নিবন্ধকের মতো প্রায় দ্রুত)। আমরা বারবার একই একই স্মৃতিতে অ্যাক্সেস করতে পারি (এটি একাধিকবার পুনরায় ব্যবহার করে) বা বার বার অংশের বিভিন্ন অংশে অ্যাক্সেস করতে পারি (উদাহরণস্বরূপ: মেমরির এই অংশের বিভিন্ন অংশে বারবার অ্যাক্সেস করে এমন একটি স্বতন্ত্র অংশে উপাদানগুলির মধ্য দিয়ে লুপিং)।
আমরা এই প্রক্রিয়াটিতে একটি রেঞ্চ ফেলে দিচ্ছি যদি এই মেমরিটি সংশোধন করে পাশের দিকে সম্পূর্ণ নতুন মেমরি ব্লক তৈরি করতে ইচ্ছুক হয়:
... এই ক্ষেত্রে, নতুন মেমরি ব্লক অ্যাক্সেস করার জন্য এটিকে মেমরির দ্রুততম ফর্মগুলিতে (রেজিস্টারে সমস্ত ভাবেই) ফিরে যেতে বাধ্যতামূলক পৃষ্ঠা ত্রুটিগুলি এবং ক্যাশে মিস করা প্রয়োজন হতে পারে। এটি একটি বাস্তব পারফরম্যান্স হত্যাকারী হতে পারে।
এটি প্রশমিত করার উপায় রয়েছে, তবে ইতিমধ্যে স্পর্শকৃত মেমরির একটি রিজার্ভ পুল ব্যবহার করে।
বড় সমষ্টি
আরেকটি ধারণাগত সমস্যা যা কিছুটা উচ্চ-স্তরের দর্শন থেকে উদ্ভূত হয় তা হ'ল বাল্কের মধ্যে সত্যিই বড় বড় সামগ্রীর অপ্রয়োজনীয় কপিগুলি।
অত্যধিক জটিল চিত্রটি এড়াতে, আসুন কল্পনা করুন যে এই সাধারণ মেমরি ব্লকটি কোনওরকম ব্যয়বহুল (সম্ভবত অবিশ্বাস্যভাবে সীমাবদ্ধ হার্ডওয়ারের ইউটিএফ -32 অক্ষর)।
এই ক্ষেত্রে যদি আমরা "সহায়তা" কে "কেআইএলএল" এর সাথে প্রতিস্থাপন করতে চেয়েছিলাম এবং এই মেমরি ব্লকটি অপরিবর্তনীয় ছিল, তবে এর একটিমাত্র অংশ পরিবর্তিত হলেও আমরা একটি সম্পূর্ণ নতুন ব্লক তৈরি করতে হবে একটি অনন্য নতুন অবজেক্ট তৈরি করতে would :
আমাদের কল্পনাশক্তিটিকে কিছুটা প্রসারিত করে, কেবলমাত্র একটি ছোট্ট অংশকে অনন্য করে তুলতে এই ধরণের সমস্ত কিছুর গভীর অনুলিপি ব্যয়বহুল হতে পারে (রিয়েল-ওয়ার্ল্ডের ক্ষেত্রে, এই মেমোরি ব্লকটি সমস্যা তৈরি করতে অনেক বড় হবে)।
তবে, এই ধরনের ব্যয় সত্ত্বেও, এই ধরণের নকশাটি মানুষের ত্রুটির থেকে অনেক কম ঝুঁকির প্রবণতা রাখে। খাঁটি ফাংশন সহ যে কোনও কার্যকরী ভাষায় কাজ করেছেন সে সম্ভবত এটির প্রশংসা করতে পারে এবং বিশেষত মাল্টিথ্রেডেড ক্ষেত্রে যেখানে আমরা বিশ্বের কোনও যত্ন ছাড়াই এই জাতীয় কোডটি মাল্টিথ্রেড করতে পারি। সাধারণভাবে, মানব প্রোগ্রামাররা রাষ্ট্রীয় পরিবর্তনগুলি ঘুরে বেড়ানোর প্রবণতা রাখে, বিশেষত এমনগুলি যা বর্তমান কার্যকারিতার বাইরে থাকা রাজ্যে বাহ্যিক পার্শ্ব প্রতিক্রিয়া সৃষ্টি করে। এমনকি এই ক্ষেত্রে একটি বাহ্যিক ত্রুটি (ব্যতিক্রম) থেকে পুনরুদ্ধার করা মিশ্রণে পরিবর্তনীয় বাহ্যিক অবস্থার পরিবর্তনের সাথে অবিশ্বাস্যরকম কঠিন হতে পারে।
এই অপ্রয়োজনীয় অনুলিপি কাজের প্রশমিত করার একটি উপায় হ'ল এই মেমরি ব্লকগুলিকে পয়েন্টারগুলির একটি সংকলন (বা রেফারেন্স) অক্ষরগুলিতে তৈরি করা, যেমন:
দুঃখিত, আমি অনুধাবন করতে ব্যর্থ হয়েছি L
ডায়াগ্রামটি তৈরি করার সময় আমাদের অনন্য তৈরি করার দরকার নেই ।
নীল অগভীর অনুলিপি করা ডেটা নির্দেশ করে।
... দুর্ভাগ্যক্রমে, এটি প্রতি চরিত্রের জন্য একটি পয়েন্টার / রেফারেন্সের মূল্য দিতে অবিশ্বাস্যভাবে ব্যয়বহুল হবে। তদ্ব্যতীত, আমরা সমস্ত ঠিকানার জায়গাগুলিতে অক্ষরগুলির বিষয়বস্তুগুলি ছড়িয়ে দিতে পারি এবং পৃষ্ঠা দোষ এবং ক্যাশে মিস করার নৌকা বোঝা আকারে এর জন্য অর্থ প্রদান শেষ করতে পারি, সহজেই এই সমাধানটিকে সম্পূর্ণরূপে অনুলিপি করার চেয়ে আরও খারাপ করে তোলে।
এমনকি যদি আমরা এই অক্ষরগুলি স্বচ্ছলভাবে বরাদ্দ করতে সাবধান হয়ে থাকি তবে মেশিনটি 8 টি অক্ষর এবং 8 টি পয়েন্টারকে একটি অক্ষরে ক্যাশে লাইনে লোড করতে পারে। আমরা নতুন স্ট্রিংটি অতিক্রম করতে এই জাতীয় স্মৃতি লোড করি:
এই ক্ষেত্রে, আমরা এই স্ট্রিংটি অতিক্রম করতে লোড করতে 7 টি বিভিন্ন ক্যাশে লাইন প্রয়োজনীয় মাপের স্মৃতি প্রয়োজন, যখন আদর্শভাবে আমাদের কেবল 3 টি প্রয়োজন।
ডেটা কাটা
উপরের সমস্যাটি প্রশমিত করতে, আমরা একই বেসিক কৌশলটি প্রয়োগ করতে পারি তবে 8 টি অক্ষরের মোটা স্তরে উদাহরণস্বরূপ
ফলাফলটির জন্য 4 টি ক্যাশে লাইনগুলির ডেটা প্রয়োজন (3 পয়েন্টারগুলির জন্য 1, এবং অক্ষরের জন্য 3) এই স্ট্রিংটি অতিক্রম করতে লোড করা দরকার যা তাত্ত্বিক সর্বোত্তমতার মাত্র 1 সংক্ষিপ্ত।
সুতরাং এটি মোটেই খারাপ নয়। কিছু মেমোরি বর্জ্য রয়েছে তবে মেমরি প্রচুর পরিমাণে এবং অতিরিক্ত ব্যবহারের ফলে ধীরগতি হয় না যদি অতিরিক্ত মেমরিটি কেবল ঘন ঘন অ্যাক্সেস না করা থাকে তবে শীতল ডেটা হতে চলেছে। এটি কেবলমাত্র গরম, সংমিশ্রিত তথ্যের জন্য যেখানে কমে যাওয়া মেমরির ব্যবহার এবং গতি প্রায়শই হাতের মুঠোয় চলে যায় যেখানে আমরা একটি পৃষ্ঠাতে বা ক্যাশে লাইনে আরও মেমরি ফিট করতে চাই এবং উচ্ছেদের আগে সমস্ত কিছুতে এটি অ্যাক্সেস করতে পারি। এই উপস্থাপনাটি বেশ ক্যাশে-বান্ধব।
দ্রুততা
সুতরাং উপরের মতো উপস্থাপনাকে কাজে লাগানো পারফরম্যান্সের বেশ শালীন ভারসাম্য দিতে পারে। সম্ভবত অপরিবর্তনীয় ডেটা স্ট্রাকচারের সর্বাধিক কর্মক্ষমতা-সমালোচনামূলক ব্যবহারগুলি অবিচ্ছেদ্য খণ্ডগুলি অনুলিপি করার সময় অবিচ্ছিন্ন উপাত্তের টুকরোগুলি পরিবর্তিত করে প্রক্রিয়াটিতে তাদের অনন্য করে তুলবে nature এটি বহুবিশ্লেষিত প্রসঙ্গে নিরাপদে অগভীর অনুলিপি করা টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে রেখেছে (সম্ভবত কিছু পারমাণবিক রেফারেন্স-গণনা চলছে)।
ততক্ষণ যতক্ষণ না এই চুনযুক্ত তথ্যগুলির টুকরোগুলি একটি মোটা পর্যায়ে উপস্থাপিত হয়, ততক্ষণ এই ওভারহেডের পরিমাণ হ্রাস পায় এবং সম্ভবত এমনকি তুচ্ছ করা হয়, তবুও আমাদের কোডিংয়ের সুরক্ষা এবং স্বাচ্ছন্দ্য এবং বহিরাগত দিক ছাড়াই আরও ফাংশনগুলিতে মাল্টিথ্রেডিং প্রদান করে প্রভাব.
নতুন এবং পুরানো ডেটা রাখা
পারফরম্যান্সের দিক থেকে (ব্যবহারিক দিক থেকে) অপরিবর্তনীয়তা সম্ভাব্য সর্বাধিক সহায়ক হিসাবে আমি দেখি যখন একটি পরিবর্তনীয় প্রেক্ষাপটে এটি অনন্য করে তুলতে বড় ডেটার পুরো কপিগুলি তৈরি করার জন্য আমাদের প্রলুব্ধ করা যেতে পারে যেখানে লক্ষ্যটি থেকে নতুন কিছু তৈরি করা is এমন কিছু যা ইতিমধ্যে এমনভাবে উপস্থিত রয়েছে যেখানে আমরা নতুন এবং পুরাতন উভয়কে রাখতে চাই, যখন আমরা কেবল যত্নশীল অবিচ্ছিন্ন নকশার সাহায্যে সামান্য বিট এবং এর টুকরো অনন্য করে তুলতে পারি।
উদাহরণ: সিস্টেম পূর্বাবস্থায় ফেরান
এর একটি উদাহরণ একটি পূর্ববর্তী ব্যবস্থা। আমরা কোনও ডেটা স্ট্রাকচারের একটি ছোট্ট অংশ পরিবর্তন করতে পারি এবং আমরা যে ফর্মটি পূর্বাবস্থায় রাখতে পারি তা এবং নতুন ফর্ম উভয়ই রাখতে চাই। এই জাতীয় অপরিবর্তনীয় ডিজাইনের সাহায্যে যা কেবলমাত্র ডেটা কাঠামোর ছোট, পরিবর্তিত বিভাগগুলিকেই অনন্য করে তোলে, কেবলমাত্র যুক্ত হওয়া অনন্য অংশের ডেটার মেমরির মূল্য পরিশোধ করার সময় আমরা কেবল পূর্ববর্তী ডেটা অনুলিপি করে সংরক্ষণ করতে পারি। এটি উত্পাদনশীলতা (একটি পূর্বাবস্থায় প্রয়োগের কেক টুকরো টুকরো টুকরো করে তোলে) এবং কার্য সম্পাদনের একটি খুব কার্যকর ভারসাম্য সরবরাহ করে।
উচ্চ-স্তরের ইন্টারফেস
তবুও উপরের কেসটির সাথে বিশ্রী কিছু উদ্ভাসিত হয়েছে। স্থানীয় ধরনের ফাংশন প্রসঙ্গে, পরিবর্তনীয় ডেটা প্রায়শই সবচেয়ে সহজ এবং সর্বাধিক সোজা ward সর্বোপরি, একটি অ্যারে সংশোধন করার সহজতম উপায় হ'ল প্রায়শই এটির মধ্য দিয়ে লুপ করা এবং একবারে একটি উপাদান পরিবর্তন করা। অ্যারে রূপান্তর করতে যদি আমাদের কাছে উচ্চ স্তরের অ্যালগরিদমগুলি বেছে নেওয়ার জন্য প্রচুর সংখ্যক উচ্চ স্তরের অ্যালগরিদম থাকে এবং এই সমস্ত খাঁটি অগভীর অনুলিপিগুলি তৈরি করা হয় তবে পরিবর্তিত অংশগুলি হ'ল তা নিশ্চিত করার জন্য উপযুক্তটিকে বাছাই করতে হলে আমরা বৌদ্ধিক ওভারহেড বাড়িয়ে শেষ করতে পারি We অনন্য করা হয়েছে।
সম্ভবত এই ক্ষেত্রেগুলির সহজতম উপায় হ'ল স্থানীয়ভাবে কোনও ফাংশনের প্রসঙ্গে (যেখানে তারা সাধারণত আমাদের ট্রিপ দেয় না) পরিবর্তনের জন্য একটি নতুন পরিবর্তনীয় অনুলিপি পেতে ডেটা কাঠামোয় পরমাণুভাবে পরিবর্তন করে থাকে (আমি বিশ্বাস করি যে কয়েকটি ভাষায় কল আসে) এই "স্থানান্তর") ...
... অথবা আমরা কেবলমাত্র উচ্চতর এবং উচ্চ-স্তরের রূপান্তর ফাংশনগুলিকে ডেটাগুলির উপরে মডেল করতে পারি যাতে আমরা পার্শ্ববর্তী বাফারকে সংশোধন করার এবং এটি পরিবর্তনযোগ্য যুক্তিযুক্ত না করে কাঠামোর প্রতিশ্রুতিবদ্ধ প্রক্রিয়াটি আড়াল করতে পারি। যাই হোক না কেন, এটি এখনও বহুলভাবে অন্বেষণকৃত অঞ্চল নয় এবং এই ডেটা কাঠামোকে কীভাবে রূপান্তর করা যায় তার অর্থবহ ইন্টারফেসগুলি নিয়ে আমরা যদি অপরিবর্তনীয় নকশাকে আরও আলিঙ্গন করি তবে আমাদের কাজ শেষ হয়ে যায়।
উপাত্ত কাঠামো
এখানে আর একটি বিষয় দেখা দেয় যে পারফরম্যান্স-সমালোচনামূলক প্রসঙ্গে ব্যবহৃত অপরিবর্তনীয়তা সম্ভবত ডেটা স্ট্রাকচারকে চানকি ডেটাগুলিতে ভাঙতে চায় যেখানে খণ্ডগুলি আকারে খুব ছোট নয় তবে খুব বড়ও নয়।
লিঙ্কযুক্ত তালিকাগুলি এটিকে সামঞ্জস্য করার জন্য এবং লিখিত তালিকাভুক্ত তালিকাতে পরিণত হতে বেশ কিছুটা পরিবর্তন করতে চাইবে। বড়, সংমিশ্রিত অ্যারেগুলি এলোমেলো অ্যাক্সেসের জন্য মডুলো সূচিকর্মের সাথে সংলগ্ন অংশগুলিতে পয়েন্টারগুলির একটি অ্যারে পরিণত হতে পারে।
এটি ডেটা স্ট্রাকচারের পরিবর্তনের ফাংশনগুলিকে বাল্কিয়ার প্রকৃতির সাথে সাদৃশ্য করতে এখানে কিছু বিট অনুলিপি করতে এবং সেখানে অন্যান্য বিটগুলি অনন্য করে তুলতে সম্ভাব্যভাবে পরিবর্তন করে data
কর্মক্ষমতা
যাইহোক, বিষয়টিতে এটি আমার সামান্য নিম্ন-স্তরের ভিউ। তাত্ত্বিকভাবে, অপরিবর্তনশীলতার খুব বড় থেকে ছোট থেকে শুরু করে কোনও ব্যয় থাকতে পারে। তবে খুব তাত্ত্বিক পদ্ধতির ফলে অ্যাপ্লিকেশনগুলি সবসময় দ্রুত হয় না। এটি তাদের স্কেলযোগ্য হতে পারে তবে বাস্তব-বিশ্বের গতির জন্য প্রায়শই আরও ব্যবহারিক মানসিকতা আলিঙ্গন করা প্রয়োজন।
ব্যবহারিক দৃষ্টিকোণ থেকে, কর্মক্ষমতা, রক্ষণাবেক্ষণযোগ্যতা এবং সুরক্ষার মতো গুণাগুলি বিশেষত খুব বড় কোডবেসের জন্য একটি বড় অস্পষ্টতায় পরিণত হয়। কিছু নিখুঁত অর্থে পারফরম্যান্স অপরিবর্তনীয়তার সাথে অবনমিত হয়, তবে উত্পাদনশীলতা এবং সুরক্ষায় (থ্রেড-সুরক্ষা সহ) এর যে উপকার রয়েছে তা তর্ক করা শক্ত। এগুলি বর্ধনের সাথে প্রায়শই ব্যবহারিক কার্যকারিতা বাড়তে পারে, কেবল কারণ যদি বিকাশকারীরা ত্রুটিযুক্ত না হয়ে তাদের কোড টিউন ও অনুকূলিতকরণ করতে আরও বেশি সময় পান।
সুতরাং আমি এই ব্যবহারিক ধারণা থেকে মনে করি, অপরিবর্তনীয় ডেটা স্ট্রাকচারগুলি বাস্তবে প্রচুর ক্ষেত্রে পারফরম্যান্সকে সহায়তা করতে পারে , যতটা অদ্ভুত শোনা যায় ততটা অদ্ভুত। একটি আদর্শ বিশ্ব সম্ভবত এই দুটিটির মিশ্রণ সন্ধান করতে পারে: অবিচ্ছেদ্য উপাত্ত কাঠামো এবং পরিবর্তনীয় বিষয়গুলির সাথে, পরিবর্তিত স্থানগুলি সাধারণত খুব স্থানীয় স্কোপ (যেমন: কোনও ফাংশনে লোকাল) ব্যবহার করা খুব নিরাপদ থাকে, যখন অপরিবর্তনীয় বাইরের দিকটি এড়াতে পারে সরাসরি প্রভাব ফেলে এবং একটি ডেটা স্ট্রাকচারের সমস্ত পরিবর্তনকে পারমাণবিক ক্রিয়াকলাপে রূপ দেয় যা জাতিগত অবস্থার কোনও ঝুঁকি ছাড়াই একটি নতুন সংস্করণ তৈরি করে।