কম্পিউটার টিউটোরিয়াল

Ruby ও Rails-এর জন্য JIT কম্পাইলার: YJIT, MJIT এবং TenderJIT দিয়ে পারফরম্যান্স বাড়ান

একটি প্রোগ্রাম রানটাইমে কম্পাইল হয় প্রি-এক্সিকিউশন কম্পাইলেশন থেকে আলাদা একটি মেথড দিয়ে। এই প্রসেসকে জাস্ট-ইন-টাইম কম্পাইলেশন বা ডাইনামিক ট্রান্সলেশন বলা হয়।

এই পোস্টে আমরা দেখব কেন JIT কম্পাইলেশন আপনার Ruby on Rails অ্যাপের জন্য ভালো পছন্দ হতে পারে, তারপর উপলব্ধ অপশনগুলো (YJIT, MJIT, এবং TenderJIT) এবং কীভাবে সেগুলো ইনস্টল করবেন সেটি দেখব।

আর তার আগে: JIT কম্পাইলেশন কীভাবে কাজ করে?

JIT কম্পাইলার কীভাবে কাজ করে

জাস্ট-ইন-টাইম কম্পাইলেশন হল কম্পিউটার কোড রান করার একটি মেথড যেটি প্রোগ্রাম রান করার সময় কম্পাইলেশন আবশ্যক করে।

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

যে কোড এক্সিকিউট হচ্ছে সেটি часто একটি সিস্টেম দ্বারা যা JIT কম্পাইলার ব্যবহার করে সeting হিসেবে নিরক্ষিত হয়। এটিকে কোডের সেই অংশগুলো চিন्हিত করে যেখানে কম্পাইলেশন বা রি-কম্পাইলেশনর বেনিফিট (স্পীডের দিক থেকে) কস্টের চেয়ে বেশি।

Ruby-র জন্য JIT কম্পাইলেশনের সুবিধা

JIT কম্পাইলেশন দুটি প্রচলিত মেথডের সুবিধা (এবং কমियां) কম্বাইন করে: ইন্টারপ্রেটেশন এবং অহেড-অফ-টাইম কম্পাইলেশন (AOT)।

মোটামুটি বললে, এটি ইন্টারপ্রেটেশনের ফ্লেক্সিবিলিটি এবং জেনারেটেড কোডের স্পীড কম্বাইন করে, এবং কম্পাইলিং ও লিংকিংর অডিশনাল ওভারহেড (শুধু ইন্টারপ্রেটিং না)।

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

একটি অপ্টিমাইজিং কম্পাইলার মেন GCC ইনস্ট্রাকশন আরও কার্যকরভাবে অপ্টিমাইজ করতে পারে — একটি রেজিস্টার-ওরিয়েন্টেড আর্কিটেকচারের বড় সুবিধা। কম্পাইলার ইন্টারমিডিয়েট রিপ্রেজেন্টেশনে রেজিস্টার-বেজড আর্কিটেকচারের ওপর অপারেট করে।

একবার আপনার ইনস্ট্রাকশন কম্পাইলেশনের সময় ইন্টারমিডিয়েট রিপ্রেজেন্টেশনে পৌঁছালে, GCC আরও পাস করে আপনার ইনস্ট্রাকশন CPU দিয়ে এক্সিকিউট হওয়ার জন্য স্পিড আপ করে।

Ruby-র জন্য JIT কম্পাইলার: YJIT, MJIT, এবং TenderJIT

এখন Ruby-র জন্য উপলব্ধ বিভিন্ন JIT কম্পাইলার — YJIT, MJIT, এবং TenderJIT — এবং সেগুলো কীভাবে সেট আপ করবেন সেটি এক্সপ্লোর করি।

Ruby-র জন্য MJIT (Method-based Just-in-time Compiler)

Vladimir Makarov MJIT ইমপ্লিমেন্ট করেছেন, এবং এটি C ল্যাঙ্গুয়েজ বেসড Ruby-তে ইমপ্লিমেন্টেড প্রথম কম্পাইলার মেথডোলজি। এটি Ruby 2.6-এ কাজ করে, YARV ইনস্ট্রাকশন ব্যবহার করে, এবং বাইনারি কোডে প্রায়ই ব্যবহৃত ইনস্ট্রাকশন কম্পাইল করে।

ইনপুট/আউটপুট-বাউন্ড নয় এমন প্রোগ্রামের জন্য MJIT পারফরম্যান্স বাড়ায়।

YJIT এই অরিজিনাল C-বেসড কম্পাইলারের চেয়ে পারফরম্যান্সের দিক থেকে बेटার। Ruby 3-এর JIT MRI-এর ইতিহাসে সবচেয়ে কুইক JIT, যা MJIT-এর চমৎকার কাজের কারণে সম্ভব হয়েছে।

MJIT কীভাবে ব্যবহার করবেন

MJIT ব্যবহার করতে, আপনি Ruby 2.6-এ JIT ইনেবল করতে পারেন --jit অপশন দিয়ে।


আপনি এই পার্ট স্কিপ করলে MJIT এরর দেখাবে।


Ruby 2.6-এ JIT-স্পেসিফিক সেটিংসের একটি কালেকশন আছে যা আমাদের বুঝতে সাহায্য করে কীভাবে এটি ফাংশন করে। ruby --help রান করে এই অপশনগুলো দেখুন।

সংক্ষেপে, MJIT একটি আলাদা থ্রেডে এক্সিকিউট হয় এবং এসিনক্রোনাস। এটি প্রথম পাঁচ বার ক্যালকুলেশন রান হলে জাস্ট-ইন-টাইম কম্পাইলেশন শুরু করে।

Ruby on Rails-র জন্য YJIT

Ruby 3.1-এ রিলিজ হয়া একটি সাম্প্রতিক JIT কম্পাইলার হল YJIT। এটিতে অনেক উন্নতি এবং ভালো পারফরম্যান্সের প্রতিশ্রুতি আছে। এখনও একটি ওয়ার্ক-ইন-প্রগ্রেস প্রজেক্ট যা Shopify ডিজাইন করেছে এক্সপেরিমেন্টাল রেজাল্টসহ, এটি সতর্কতার সাথে ব্যবহার করা উচিত, বিশেষ করে বড় অ্যাপ্লিকেশনে।

সেটি মনে রেখে, YJIT Ruby on Rails অ্যাপ্লিকেশনের পারফরম্যান্স বাড়ায়। অধিকাংশ রিয়েল-ওয়ার্ল্ড সফ্টওয়্যার YJIT বেসিক ব্লক ভার্সনিং JIT কম্পাইলারের দ্রুত ওয়ার্ম-আপ এবং পারফরম্যান্স এনহ্যান্সমেন্টের সুবিধা পায়।

YJIT প্রজেক্টের অংশ হিসেবে একটি JIT কম্পাইলার ধীরে ধীরে CRuby-তে বিল্ট-ইন হবে, যা بعدে অধিকাংশ কোড এক্সিকিউশনের জন্য ইন্টারপ্রেটারকে রিপ্লেস করবে।

অফিসিয়াল বেনচмар্ক — 'YJIT: Building a New JIT Compiler for CRuby' দেখুন — দেখাচ্ছে YJIT ডিফল্ট CRuby ইন্টারপ্রেটারের চেয়ে পারফরম্যান্স কতটুকু উন্নত করেছে:

  • railsbench-এ ২০%
  • liquid template rendering-এ ৩৯%
  • activerecord-এ ৩৭%

তবে:

railsbench-এ শুধু ৭৯% ইনস্ট্রাকশন YJIT দ্বারা এক্সিকিউট হয়, বাকি ডিফল্ট ইন্টারপ্রেটারে রান করে।

সোর্স: YJIT: Building a New JIT Compiler for CRuby

এটি মানে YJIT-এর বর্তমান রেজাল্ট আরও উন্নত করার জন্য অনেক কাজ বাকি।

তবুও, YJIT প্রতিটি বেনচмар্কে ইন্টারপ্রেটারের কমপক্ষে সমান পারফর্ম করে, এমনকি সবচেয়ে কঠিন مواردেও, এবং প্রতিটি বেনচमार্কের মাত্র এক ইটারেশনের পর नियর-পিক পারফরম্যান্সে পৌঁছায়।

YJIT কীভাবে ব্যবহার করবেন

নোট: YJIT বর্তমানে macOS এবং Linux-এ x86-64 প্ল্যাটফর্মের জন্য সীমাবদ্ধ। এছাড়া, যেমন বললাম, YJIT বড় অ্যাপ্লিকেশনের জন্য রিকমেন্ডেড নয় (এখনও)।

YJIT ডিফল্টভাবে ডিজেবলড। আপনি যদি এনাবল করতে চান, প্রথমে --yjit কমান্ড-লাইন অপশন স্পেসিফাই করুন।

আপনাকে চেক করতে হবে এটি ইনস্টলড কিনা, তাই ruby --enable-yjit -v রান করুন। যদি warning: unknown argument for --enable: yjit'` দেখাবে, তবে আপনাকে ইনস্টল করতে হবে।

তারপর irb খুলুন এবং RUBY_YJIT_ENABLE=1 সেট করুন। আপনি এক্সিট করুন এবং এখন, আপনি YJIT ব্যবহার করার জন্য রেডি। কমান্ড ruby --enable-yjit -v অবশ্যই কিছুতে রিটার্ন করতে হবে যেন ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21]

TenderJIT

YJIT-এর ওপর ভিত্তি করে ডিজাইন করা TenderJIT হল Ruby-র জন্য একটি এক্সপেরিমেন্টাল JIT কম্পাইলার। TenderJIT-এর আলাদা কি? এটি পিউর Ruby-তে লেখা।

এটি একটি ডেমো প্রজেক্ট এবং লক্ষ্য হল এটিকে একটি gem হিসেবে শিপ করা। মিনিটাম, আপনি এর সাথে এক্সপেরিমেন্ট করতে পারেন, কিন্তু মনে রাখবেন এখনও ওয়ার্ক ইন প্রগ্রেস। TenderJIT-এর জন্য Ruby 3.0.2 বা পরবর্তী ভার্সন দরকার।

TenderJIT কীভাবে ব্যবহার করবেন

TenderJIT বর্তমানে মেথড কম্পাইলেশন অটোমেটিক্যালি করে না। একটি মেথড কম্পাইল করতে, আপনাকে ম্যানুয়ালি TenderJIT কনফিগার করতে হবে।

রিপোজিটরি ক্লোন করুন এবং নিচের কমান্ডগুলো রান করুন:


আপনাকে আপনার কোডে ম্যানুয়ালি সেট করতে হবে:


টার্গেট মেথডের প্রতিটি YARV ইনস্ট্রাকশন TenderJIT পড়ে, যা তারপর সেটিকে মেশিন কোডে ট্রান্সফর্ম করে।

TenderJIT-র সাথে আরও উদাহরণের জন্য এই ভিডিওগুলো চেক করুন: A JIT compiler for Ruby with Aaron Patterson এবং Hacking on TenderJIT!

উপসংহার

এই পোস্টে আমরা Ruby-র তিনটি JIT কম্পাইলার — MJIT, YJIT, এবং TenderJIT — এবং কীভাবে সেগুলো সেট আপ করবেন সেটি দ্রুত দেখেছি। প্রতিটি অপশন এক্সপেরিমেন্টাল এবং এর নিজস্ব লিমিটেশনসহ আসে।

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

আপনি যদি Ruby-র জন্য নিজের কম্পাইলার বিল্ড করতে চান তবে এই পোস্ট চেক আউট করুন।

শুভ কোডিং!

ন.ব. আপনি যদি Ruby Magic পোস্টগুলো প্রকাশ होते সাথে সাথে পড়তে চান, আমাদের Ruby Magic নিউজলেটার সাবস্ক্রাইব করুন এবং একটাও পোস্ট মিস করবেন না!

Ruby ও Rails-এর জন্য JIT কম্পাইলার: YJIT, MJIT এবং TenderJIT দিয়ে পারফরম্যান্স বাড়ান

Renata Marques

আমাদের গেস্ট অথর Renata একজন সফ্টওয়্যার ইঞ্জিনিয়ার এবং কম্পিউটার সায়েন্টিস্ট যিনি Ruby এবং Javascript-এ ফোকাসড। তিনি ওপেন সোর্স প্রজেক্টে কন্ট্রিবিউট করে ডেভেলপার কমিউনিটিকে সাহায্য করতে পছন্দ করেন। ফার্স্ট টাইমে সে সিনেমা ও টিভি শো দেখা ও আলোচনা করা, বই পড়া, সঙ্গীত শোনা, ফটোগ্রাফি, এবং ভিডিও বানানো পছন্দ করেন।

Renata Marques-এর সকল আর্টিকেল


  1. বর্গক্ষেত্রের অন্তর্ভুক্ত বৃত্তের ক্ষেত্রফল বের করার প্রোগ্রাম

  2. HTML-এ required অ্যাট্রিবিউট কীভাবে ব্যবহার করবেন?

  3. সি ভাষায় টোকেন (Tokens) কী?

  4. অ্যান্ড্রয়েডে CopyOnWriteArraySet-এ containsAll() মেথড ব্যবহার