? -ক্যালকুলাস: ফাংশনগুলির স্মৃতি উপস্থাপনে সবচেয়ে দক্ষ কোনটি?


9

আমি ফাংশন এনকোডেড (চার্চের / স্কট) বনাম ক্লাসিক্যালি এনকোডেড (এসেম্বলার / সি) ডেটা স্ট্রাকচারের পারফরম্যান্সের তুলনা করতে চাই।

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

আমি বর্তমান এনকোডিং অ্যালগরিদম জনপ্রিয় ফাংশনাল ল্যাঙ্গুয়েজ (হাস্কেল, এমএল) এবং সর্বাধিক দক্ষ একটিতে অর্জন করতে আগ্রহী।


বোনাস পয়েন্ট: এমন এনকোডিং সেটি মানচিত্রে এনকোড নেটিভ পূর্ণসংখ্যার থেকে পূর্ণসংখ্যার ফাংশন (Is short, intইত্যাদি সি)। এটা কি সম্ভব?


আমি পারফরম্যান্সের ভিত্তিতে দক্ষতার মূল্যায়ন করি। অন্য কথায়, এনকোডিং যত বেশি কার্যকর তত কম কার্যক্ষম ডাটা স্ট্রাকচারের সাথে গণনার কার্যকারিতা প্রভাবিত করে।


আমার সমস্ত গুগল প্রচেষ্টা ব্যর্থ হয়েছে, সম্ভবত আমি সঠিক কীওয়ার্ডগুলি জানি না।
ফোর্ড ও।

আপনি "দক্ষ" বলতে কী বোঝায় তা বোঝাতে প্রশ্নটি সম্পাদনা করতে পারেন? কিসের জন্য দক্ষ? আপনি যখন একটি দক্ষ ডেটা কাঠামোর জন্য জিজ্ঞাসা করছেন, আপনাকে ডেটা কাঠামোতে কী কী অপারেশন সম্পাদন করতে সক্ষম হতে হবে তা নির্দিষ্ট করতে হবে, কারণ এটি ডেটা কাঠামোর পছন্দকে প্রভাবিত করে। অথবা আপনি কী বোঝাতে চাইছেন যে এনকোডিংটি যতটা সম্ভব স্থান-দক্ষ?
ডিডাব্লিউ

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

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

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

উত্তর:


11

জিনিসটি হ'ল, ফাংশন এনকোডিংয়ের ক্ষেত্রে খুব বেশি কিছু নেই। এখানে মূল বিকল্পগুলি:

  • টার্ম রাইটিং: আপনি ফাংশনগুলিকে তাদের বিমূর্ত সিনট্যাক্স ট্রি (বা এর কিছু এনকোডিং হিসাবে সংরক্ষণ করেন। ।

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

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

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

আমি বর্তমান এনকোডিং অ্যালগরিদম জনপ্রিয় ফাংশনাল ভাষা (হাস্কেল, এমএল) উভয় ব্যবহারে আগ্রহী in

আমি কোনও বিশেষজ্ঞ নই, তবে আমি 99% বেশিরভাগ এমএল স্বাদগুলি সম্ভবত বর্ণিত কিছু অপ্টিমাইজেশান সত্ত্বেও আমি বর্ণিত ক্লোজারগুলির কিছু প্রকরণ ব্যবহার করি। দেখুন এই দৃষ্টিকোণ (সম্ভবত তারিখ আউট) একটি জন্য।

অলস মূল্যায়নের কারণে হাস্কেল কিছুটা জটিল জটিল কাজ করে: এটি স্পাইনলেস ট্যাগলেস গ্রাফ পুনর্নির্মাণ ব্যবহার করে ।

এবং অর্জন করা যায় এমন সবচেয়ে দক্ষ একটিতেও।

সবচেয়ে দক্ষ কি? এমন কোনও বাস্তবায়ন নেই যা সমস্ত ইনপুট জুড়ে সর্বাধিক দক্ষ হবে, সুতরাং আপনি কার্যকরভাবে কার্যকরভাবে বাস্তবায়ন পান তবে প্রতিটি পৃথক পরিস্থিতিতে উন্নত হবে। সুতরাং সর্বাধিক বা স্বল্প দক্ষতার কোনও নির্দিষ্ট র‌্যাঙ্কিং নেই।

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

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

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

বোনাস পয়েন্ট: এমন কোনও এনকোডিং রয়েছে যে মানচিত্রের ক্রিয়াকলাপটি দেশীয় পূর্ণসংখ্যার (সি তে সংক্ষিপ্ত, আন্ত ইত্যাদি) তে এনকোড করা পূর্ণসংখ্যা। এটা কি সম্ভব?

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

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

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

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