আমি কেবল শিখেছি কীভাবে অলস মূল্যায়ন কাজ করে এবং আমি ভাবছিলাম: বর্তমানে উত্পাদিত প্রতিটি সফ্টওয়্যারটিতে অলস মূল্যায়ন প্রয়োগ করা হয় না কেন? কেন এখনও আগ্রহী মূল্যায়ন ব্যবহার করছেন?
আমি কেবল শিখেছি কীভাবে অলস মূল্যায়ন কাজ করে এবং আমি ভাবছিলাম: বর্তমানে উত্পাদিত প্রতিটি সফ্টওয়্যারটিতে অলস মূল্যায়ন প্রয়োগ করা হয় না কেন? কেন এখনও আগ্রহী মূল্যায়ন ব্যবহার করছেন?
উত্তর:
অলস মূল্যায়নের জন্য বুক-কিপিং ওভারহেডের প্রয়োজন you এটি এখনও এবং এই জাতীয় বিষয়গুলি মূল্যায়ন করা হয়েছে কিনা তা আপনাকে জানতে হবে। আগ্রহী মূল্যায়ন সর্বদা মূল্যায়ন করা হয়, সুতরাং আপনার জানার দরকার নেই। এটি বিশেষত সমবর্তী প্রসঙ্গে সত্য।
দ্বিতীয়ত, আগ্রহী মূল্যায়নকে অলস মূল্যায়নে প্যাকেজিংয়ের মাধ্যমে এটি পরে ফাংশন অবজেক্টে রূপান্তর করা তুচ্ছ , যদি আপনি ইচ্ছা করেন।
তৃতীয়ত, অলস মূল্যায়ন নিয়ন্ত্রণের ক্ষতি বোঝায়। যদি আমি কোনও ডিস্ক থেকে কোনও ফাইল পড়া অলসভাবে মূল্যায়ন করি? নাকি সময় পাচ্ছেন? এটা গ্রহণযোগ্য নয়।
আগ্রহী মূল্যায়ন আরও দক্ষ এবং আরও নিয়ন্ত্রণযোগ্য হতে পারে এবং তুচ্ছভাবে অলস মূল্যায়নে রূপান্তরিত হয়। আপনি কেন অলস মূল্যায়ন চান?
readFile
এটিই । তদুপরি, অলস থেকে উত্সাহী মূল্যায়নে রূপান্তর তেমনি তুচ্ছ।
head [1 ..]
আগ্রহের সাথে মূল্যায়ন করেছেন খাঁটি ভাষায়, কারণ হাস্কেল এটি দেয় 1
?
মূলত অলস কোড এবং রাজ্যটি খারাপভাবে মিশে যেতে পারে এবং বাগগুলি খুঁজে পেতে কিছু শক্ত করতে পারে। যদি কোনও নির্ভরশীল অবজেক্টের স্থিতি পরিবর্তন হয় তবে আপনার অলস বস্তুর মান মূল্যায়ন করলে ভুল হতে পারে। প্রোগ্রামার স্পষ্টভাবে আইটেমটিকে অলস হতে কোড কোড করানো আরও ভাল, যখন তিনি জানেন যে পরিস্থিতিটি উপযুক্ত কিনা।
একদিকে নোটে হাস্কেল সবকিছুর জন্য অলস মূল্যায়ন ব্যবহার করে। এটি সম্ভব কারণ এটি একটি কার্যকরী ভাষা এবং রাষ্ট্র ব্যবহার করে না (কয়েকটি ব্যতিক্রমী পরিস্থিতিতে যেখানে সেগুলি স্পষ্টভাবে চিহ্নিত করা হয়েছে ব্যতীত)
set!
অলস স্কিম ইন্টারপ্রেটার ব্যবহার করা । > :(
অলস মূল্যায়ন সবসময় ভাল হয় না।
অলস মূল্যায়নের কার্যকারিতা সুবিধাগুলি দুর্দান্ত হতে পারে তবে আগ্রহী পরিবেশে সর্বাধিক অপ্রয়োজনীয় মূল্যায়ন এড়ানো কঠিন নয় - অবশ্যই অলসতা এটিকে সহজ এবং সম্পূর্ণ করে তুলেছে তবে কোডটিতে অপ্রয়োজনীয় মূল্যায়ন খুব কমই ঘটে।
অলস মূল্যায়ন সম্পর্কে ভাল জিনিস যখন এটি আপনাকে পরিষ্কার কোড লিখতে দেয়; অসীম প্রাকৃতিক সংখ্যা তালিকা ফিল্টার করে 10 তম প্রাইম প্রাপ্তি এবং তালিকার 10 তম উপাদানটি গ্রহণের অগ্রযাত্রার সবচেয়ে সংক্ষিপ্ত এবং স্পষ্ট উপায়: (সিউডোকোড)
let numbers = [1,2...]
fun is_prime x = none (map (y-> x mod y == 0) [2..x-1])
let primes = filter is_prime numbers
let tenth_prime = first (take primes 10)
আমি বিশ্বাস করি অলসতা ছাড়াই এত সংক্ষেপে জিনিস প্রকাশ করা বেশ কঠিন হবে।
তবে অলসতা সবকিছুর জবাব নয়। প্রারম্ভিকদের জন্য, অলসতা রাষ্ট্রের উপস্থিতিতে স্বচ্ছভাবে প্রয়োগ করা যায় না, এবং আমি বিশ্বাস করি রাষ্ট্রীয়তা স্বয়ংক্রিয়ভাবে সনাক্ত করা যায় না (যদি না আপনি হাস্কেল, যখন রাষ্ট্রটি বেশ স্পষ্ট হয় তখনই বলে কাজ করছেন)। সুতরাং, বেশিরভাগ ভাষায়, অলসতাটি ম্যানুয়ালি করা দরকার যা জিনিসগুলিকে কম স্পষ্ট করে তোলে এবং এইভাবে অলসতার বড় সুবিধাগুলির মধ্যে একটি অপসারণ করে।
তদুপরি, অলসতার পারফরম্যান্স ঘাটতি রয়েছে, কারণ এটি অ-মূল্যায়িত অভিব্যক্তিগুলি চারপাশে রাখার একটি উল্লেখযোগ্য ওভারহেড সরবরাহ করে; তারা সঞ্চয়স্থান ব্যবহার করে এবং এগুলি সাধারণ মানের তুলনায় ধীর হয়। অলস সংস্করণটি কুকুরের ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়ে যায়, কারণ এটি অবিশ্বাস্য-আইপি কোড করতে হবে তা অস্বাভাবিক নয় and
যেমনটি ঘটতে থাকে, তেমন কোনও নিখুঁত সেরা কৌশল নেই। অলস দুর্দান্ত যদি আপনি অসীম ডেটা স্ট্রাকচার বা অন্য কৌশলগুলি ব্যবহারের সুযোগ দেয় তবে আপনি আরও ভাল কোড লিখতে পারেন তবে উত্সাহীকরণ আরও সহজ হতে পারে।
উত্সাহী এবং অলস মূল্যায়নের পক্ষে ও কুফলগুলির একটি সংক্ষিপ্ত তুলনা এখানে দেওয়া হল:
আগ্রহী মূল্যায়ন:
অকারণে স্টাফ মূল্যায়ন করার সম্ভাব্য ওভারহেড।
আনহাইন্ডার্ড, দ্রুত মূল্যায়ন।
অলস মূল্যায়ন:
কোন অপ্রয়োজনীয় মূল্যায়ন নেই।
কোনও মানের প্রতিটি ব্যবহারে বুককিপিং ওভারহেড।
সুতরাং, আপনার যদি এমন অনেক মত প্রকাশ থাকে যা কখনই মূল্যায়ন করতে হয় না, অলস আরও ভাল; তবুও যদি আপনার কোনও অভিব্যক্তি না থাকে যা মূল্যায়নের প্রয়োজন হয় না, অলস খাঁটি ওভারহেড।
এখন, আসল ওয়ার্ল্ড সফটওয়্যারটি একবার দেখে নেওয়া যাক: আপনি যে কতগুলি ফাংশন লেখেন তাদের সমস্ত যুক্তির মূল্যায়ন প্রয়োজন হয় না ? বিশেষত আধুনিক সংক্ষিপ্ত ফাংশনগুলির সাথে যা কেবলমাত্র একটি কাজ করে, এই বিভাগে ফাংশনগুলির শতাংশ খুব কম is সুতরাং, অলস মূল্যায়ন আসলে কিছু সংরক্ষণের সুযোগ ছাড়াই বেশিরভাগ সময় বুককিপিং ওভারহেডের সাথে পরিচয় করিয়ে দেয়।
ফলস্বরূপ, অলস মূল্যায়ন কেবল গড় হিসাবে অর্থ প্রদান করে না, উত্সাহী মূল্যায়ন আধুনিক কোডের জন্য আরও ভাল ফিট।
@ ডেড এমএমজি হিসাবে উল্লেখ করা হয়েছে যে অলস মূল্যায়নের জন্য বইয়ের উপরের উপরে রাখার প্রয়োজন রয়েছে। আগ্রহী মূল্যায়নের তুলনায় এটি ব্যয়বহুল হতে পারে। এই বিবৃতি বিবেচনা করুন:
i = (243 * 414 + 6562 / 435.0 ) ^ 0.5 ** 3
এটি গণনা করতে কিছুটা সময় নিবে। আমি যদি অলস মূল্যায়ন ব্যবহার করি তবে আমার যতবার এটি ব্যবহার করা হয়েছে ততবার তা মূল্যায়ন করা হয়েছে কিনা তা যাচাই করা উচিত। এটি যদি ভারী ব্যবহৃত টাইট লুপের ভিতরে থাকে তবে ওভারহেড উল্লেখযোগ্যভাবে বৃদ্ধি পায়, তবে কোনও লাভ নেই।
উত্সাহী মূল্যায়ন এবং একটি শালীন সংকলক সহ সূত্রটি সংকলন সময়ে গণনা করা হয়। বেশিরভাগ অপ্টিমাইজারগুলি যদি যথাযথভাবে ঘটে তবে যে কোনও লুপের মধ্যে অ্যাসাইনমেন্টটি সরিয়ে ফেলবে।
অলস মূল্যায়ন ডেটা লোড করার পক্ষে সবচেয়ে উপযুক্ত which মূল কার্যকারিতার চেয়ে কেসগুলি প্রান্তিক করা আরও উপযুক্ত।
সাধারণভাবে যত তাড়াতাড়ি সম্ভব অ্যাক্সেস করা জিনিসগুলি মূল্যায়ণ করা ভাল অনুশীলন। অলস মূল্যায়ন এই অনুশীলনের সাথে কাজ করে না। আপনি যদি সর্বদা কিছু অ্যাক্সেস করতে চান তবে সমস্ত অলস মূল্যায়ন হ'ল ওভারহেড যুক্ত করা। অলস মূল্যায়ন ব্যবহারের ব্যয় / সুবিধা হ্রাস হওয়ায় আইটেমটি অ্যাক্সেস হওয়ার সম্ভাবনা কম হয়ে যায়।
সর্বদা অলস মূল্যায়ন ব্যবহার প্রাথমিক প্রবণতাও বোঝায়। এটি একটি খারাপ অভ্যাস যা প্রায়শই কোডের ফলাফল দেয় যা অনেক বেশি জটিল এবং ব্যয়বহুল যা অন্যথায় ক্ষেত্রে হতে পারে। দুর্ভাগ্যক্রমে, অকাল অপটিমাইজেশনের প্রায়শই এমন কোডের ফলাফল হয় যা সহজ কোডের চেয়ে ধীর করে দেয়। যতক্ষণ না আপনি অপ্টিমাইজেশনের প্রভাবটি পরিমাপ করতে পারবেন ততক্ষণ আপনার কোডটি অপ্টিমাইজ করা খারাপ ধারণা।
অকাল অপটিমাইজেশন এড়ানো ভাল কোডিং অভ্যাসগুলির সাথে বিরোধ নয়। যদি ভাল অনুশীলনগুলি প্রয়োগ না করা হয়, তবে প্রাথমিক অপ্টিমাইজেশানগুলি ভাল কোডিং অনুশীলনগুলি যেমন লুপের বাইরে চলার গণনাগুলি প্রয়োগ করে থাকতে পারে।
যদি আমাদের কোনও অভিব্যক্তিটির মান নির্ধারণের জন্য সম্পূর্ণরূপে মূল্যায়ন করতে হয় তবে অলস মূল্যায়নের অসুবিধা হতে পারে। আমরা বুলিয়ান মান একটি দীর্ঘ তালিকা আছে বলুন এবং আমরা খুঁজে বের করতে যদি চান সব তাদের সত্য হল:
[True, True, True, ... False]
এটি করতে গেলে তালিকার প্রতিটি উপাদানকে আমাদের দেখতে হবে, তা যাই হোক না কেন, অলসভাবে মূল্যায়ন কেটে যাওয়ার কোনও সম্ভাবনা নেই। তালিকার সমস্ত বুলিয়ান মানগুলি সত্য কিনা তা নির্ধারণ করতে আমরা একটি ভাঁজ ব্যবহার করতে পারি। যদি আমরা একটি ভাঁজ ডানটি ব্যবহার করি যা অলস মূল্যায়ন ব্যবহার করে তবে অলস মূল্যায়নের কোনও সুবিধা আমরা পাই না কারণ তালিকার প্রতিটি উপাদানকে আমাদের দেখতে হবে:
foldr (&&) True [True, True, True, ... False]
> 0.27 secs
একটি ভাঁজ বামের চেয়ে ডান ভাঁজটি এক্ষেত্রে অনেক ধীর হবে যা অলস মূল্যায়ন ব্যবহার করে না:
foldl' (&&) True [True, True, True, ... False]
> 0.09 secs
কারণটি হ'ল বামে লেজ পুনরাবৃত্তিগুলির কঠোর ভাঁজ ব্যবহার করে, যার অর্থ এটি রিটার্নের মান সংগ্রহ করে এবং স্মৃতিতে অপারেশনগুলির একটি বৃহত্তর শৃঙ্খলা তৈরি করে না। এটি অলস ভাঁজ ডানদিকের চেয়ে অনেক দ্রুত কারণ উভয় ফাংশনকে যাইহোক পুরো তালিকাটি দেখতে হবে এবং ভাঁজ ডানদিকে লেজ পুনরাবৃত্তি ব্যবহার করতে পারবেন না। সুতরাং, মুল বক্তব্যটি হ'ল হাতের কাজটির জন্য সর্বোত্তম যা ব্যবহার করা উচিত।