performance - হাস্কেল(জিএইচসি) এত দ্রুত সাজাতে কেন?




haskell ghc (2)

আমি মনে করি এটি একটুখানি মতামত ভিত্তিক। তবে আমি উত্তর দেওয়ার চেষ্টা করব।

আমি ডায়েটারিচ এপ্পের সাথে একমত: এটি বেশ কয়েকটি জিনিসের সংমিশ্রণ যা জিএইচসি দ্রুত তৈরি করে।

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

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

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

এটি দেখার আরেকটি উপায় হতে পারে… কেন হাস্কেল দ্রুত হওয়া উচিত নয় ? এটি কী করে যা এটি ধীর করে দেয়?

এটি পার্ল বা জাভাস্ক্রিপ্টের মতো ব্যাখ্যা করা ভাষা নয়। এটি জাভা বা সি # এর মতো ভার্চুয়াল মেশিন সিস্টেমও নয়। এটি নেটিভ মেশিন কোডের নিচে সমস্তভাবে সংকলন করে, তাই ওভারহেড নেই no

ওও ভাষাগুলি [জাভা, সি #, জাভাস্ক্রিপ্ট ...] এর বিপরীতে, হাস্কেলের পুরো টাইপ ক্ষয় রয়েছে [যেমন সি, সি ++, পাস্কাল…]। সমস্ত ধরণের চেকিং কেবল সংকলন সময়ে ঘটে happens সুতরাং আপনাকে ধীর করে দেওয়ার জন্য কোনও রান-টাইম টাইপ-চেকিং নেই। (এই বিষয়টির জন্য কোনও নাল পয়েন্টার চেক নেই In এর মধ্যে, জাভা বলতে, জেভিএম অবশ্যই নাল পয়েন্টারগুলি পরীক্ষা করে অবশ্যই একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে যদি আপনি কোনওটিকে সম্মান করেন Has হাস্কেলকে সেই চেকটি নিয়ে বিরক্ত করার দরকার নেই))

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

পাস্কাল সম্পর্কে চিন্তা করুন। এটি পুরানো এবং সত্যই কেউ এটিকে আর ব্যবহার করে না, তবে কেউই অভিযোগ করবে না যে পাস্কাল ধীর । এটি সম্পর্কে অপছন্দ করার মতো প্রচুর জিনিস রয়েছে তবে আস্তে আস্তে আস্তে এগুলির মধ্যে একটি নয়। ম্যানুয়াল মেমরি ম্যানেজমেন্টের পরিবর্তে আবর্জনা সংগ্রহের চেয়ে হাস্কেল সত্যিই পাসকালের চেয়ে আলাদা কিছু করতে পারছে না। এবং অপরিবর্তনীয় ডেটা জিসি ইঞ্জিনে [যা অলস মূল্যায়ন কিছুটা জটিল করে তোলে] বেশ কয়েকটি অনুকূলকরণের অনুমতি দেয় ations

আমি মনে করি বিষয়টি হ্যাস্কেলকে উন্নত এবং পরিশীলিত এবং উচ্চ স্তরের দেখায় এবং প্রত্যেকেই মনে করে "ওহ বাহ্, এটি সত্যিই শক্তিশালী, এটি অবশ্যই আশ্চর্যজনকভাবে ধীর হতে হবে! " তবে এটি তা নয়। বা কমপক্ষে, এটি আপনি যেভাবে প্রত্যাশা করবেন তা নয় isn't হ্যাঁ, এটি একটি আশ্চর্যজনক টাইপ সিস্টেম পেয়েছে। তবে আপনি কি জানেন? যে সমস্ত সংকলন সময়ে ঘটে। রান-টাইমে, এটি চলে গেছে। হ্যাঁ, এটি আপনাকে কোডের একটি লাইন দিয়ে জটিল এডিটিগুলি তৈরি করতে দেয়। তবে আপনি কি জানেন? একটি এডিটি struct এর কেবল একটি সাধারণ সাধারণ union । বেশি কিছু না.

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

উদাহরণস্বরূপ, আমি একটি ফাইলের মধ্যে প্রতিটি বাইট কতবার প্রদর্শিত হয় তা গণনা করার জন্য একটি তুচ্ছ ছোট্ট প্রোগ্রাম লিখেছি। একটি 25 কেবি ইনপুট ফাইলের জন্য, প্রোগ্রামটি চালাতে 20 মিনিট সময় নিয়েছিল এবং 6 গিগাবাইট র‍্যাম গিলে ফেলেছে! এটাই অযৌক্তিক !! তবে আমি বুঝতে পারলাম সমস্যাটি কী, একক ঠাঁই-ধাঁচ যুক্ত করেছে এবং রান- টাইমটি 0.02 সেকেন্ডে নেমে গেছে।

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

হাস্কেল এত তাড়াতাড়ি কী করে? বিশুদ্ধতা. স্থির প্রকারের। আলস্য। তবে সর্বোপরি, পর্যাপ্ত উচ্চ-স্তরের হয়ে যা সংকলকটি আপনার কোডের প্রত্যাশা ভঙ্গ না করে বাস্তবায়ন আমূল পরিবর্তন করতে পারে।

তবে আমি অনুমান করি এটি আমার মতামত ...

হাস্কেল ( GHC সংকলক সহ) আপনার প্রত্যাশার চেয়ে অনেক দ্রুত । সঠিকভাবে ব্যবহৃত হয়, এটি নিম্ন-স্তরের ভাষাগুলির কাছাকাছি যেতে পারে। (হাস্কেল্লারদের একটি পছন্দনীয় কাজ হ'ল চেষ্টা করা এবং 5% সি এর মধ্যে পাওয়া (বা এমনকি এটি পরাজিতও করা হয়েছে তবে এর অর্থ আপনি একটি অদক্ষ সি প্রোগ্রাম ব্যবহার করছেন, যেহেতু জিএইচসি হ্যাস্কেলকে সি-কে সংকলন করেছে)।) আমার প্রশ্ন, কেন?

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

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

দুঃখিত, যদি এটি রেন্টি শব্দ করে চলেছে, তবে এখানে আমার প্রশ্ন: হাস্কেল কেন তার বিমূর্ত প্রকৃতি এবং শারীরিক মেশিনের পার্থক্য বিবেচনা করে এত তাড়াতাড়ি (জিএইচসি সংকলিত)?

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


ঠিক আছে, এখানে মন্তব্য করার অনেক আছে। আমি যতটা পারি উত্তর দেওয়ার চেষ্টা করব।

সঠিকভাবে ব্যবহৃত হয়, এটি নিম্ন-স্তরের ভাষাগুলির কাছাকাছি যেতে পারে।

আমার অভিজ্ঞতায়, সাধারণত অনেক ক্ষেত্রে রাস্টের পারফরম্যান্স 2x এর মধ্যে পাওয়া সম্ভব। তবে এমন কিছু (বিস্তৃত) ব্যবহারের ক্ষেত্রেও রয়েছে যেখানে নিম্ন স্তরের ভাষার তুলনায় কর্মক্ষমতা দুর্বল।

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

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

মোটামুটিভাবে ট্যুরিং মেশিনের উপর ভিত্তি করে মেশিন আর্কিটেকচারগুলি স্পষ্টতই আবশ্যক।

এটি সম্পর্কে চিন্তা করার ভাল উপায় নয়, বিশেষত যেহেতু আধুনিক প্রসেসরগুলি নির্দেশাবলীর বাইরে এবং সম্ভবত একই সময়ে নির্দেশাবলীর মূল্যায়ন করবে।

আসলে, হাস্কেলের একটি নির্দিষ্ট মূল্যায়ন আদেশও নেই order

আসলে, হাস্কেল স্পষ্টভাবে একটি মূল্যায়ন আদেশ সংজ্ঞায়িত করে

এছাড়াও, মেশিনের ডেটা ধরণের সাথে কথা বলার পরিবর্তে আপনি বরাবর বীজগণিত ডেটা টাইপ তৈরি করেন।

আপনার যথেষ্ট পরিমাণে উন্নত সংকলক রয়েছে তবে এগুলি বেশ কয়েকটি ক্ষেত্রে সাফল্য অর্জন করে।

আপনি ভাবেন যে ফ্লাইতে ফাংশন তৈরি করা এবং এগুলি চারপাশে ছড়িয়ে দেওয়া একটি প্রোগ্রামকে ধীর করে দেবে।

হাস্কেল সংকলিত, এবং তাই উচ্চতর-আদেশ ক্রিয়াকলাপগুলি আসলে ফ্লাইতে তৈরি হয় না।

এটি হাস্কেল কোডটি অপ্টিমাইজ করে বলে মনে হচ্ছে, আরও মেশিনের মতো না করে আপনার এটিকে আরও মার্জিত এবং বিমূর্ত করতে হবে।

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

উদাহরণস্বরূপ, হ্যাসকেলে fx = [x] এবং f = pure হুবহু একই জিনিস। একটি ভাল সংকলক আগের ক্ষেত্রে ভাল পারফরম্যান্স দিতে পারে না।

হ্যাজেল কেন তার বিমূর্ত প্রকৃতি এবং শারীরিক মেশিনের পার্থক্য বিবেচনা করে এত তাড়াতাড়ি (জিএইচসি দিয়ে সংকলিত)?

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

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

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






lambda-calculus