রুবির কর্মক্ষমতা অনেক উন্নত হচ্ছে, সংস্করণের পর সংস্করণ… এবং রুবি ডেভেলপমেন্ট টিম রুবিকে আরও দ্রুত করার জন্য সর্বাত্মক প্রচেষ্টা চালিয়ে যাচ্ছে!
এই প্রচেষ্টাগুলির মধ্যে একটি হল 3×3 প্রকল্প৷
৷লক্ষ্য?
রুবি 3.0 রুবি 2.0 এর চেয়ে 3 গুণ দ্রুত হবে .
এই প্রকল্পের অংশ হল নতুন MJIT কম্পাইলার, যা এই নিবন্ধের বিষয়।
MJIT ব্যাখ্যা করা হয়েছে
MJIT এর অর্থ হল "পদ্ধতি ভিত্তিক জাস্ট-ইন-টাইম কম্পাইলার"।
এর মানে কি?
রুবি আপনার কোডকে YARV নির্দেশাবলীতে কম্পাইল করে , এই নির্দেশাবলী রুবি ভার্চুয়াল মেশিন দ্বারা চালিত হয়।
JIT এটিতে আরেকটি স্তর যোগ করে।
এটি প্রায়শই ব্যবহৃত নির্দেশাবলী কম্পাইল করবে বাইনারি কোডে।
ফলাফল হল একটি অপ্টিমাইজ করা বাইনারি যা আপনার কোডকে দ্রুত চালায়৷
৷এটি কিভাবে কাজ করে
আসুন জেনে নেই কিভাবে MJIT এটিকে আরও ভালোভাবে বুঝতে কাজ করে।
আপনি রুবি 2.6 এবং --jit
দিয়ে JIT সক্ষম করতে পারেন বিকল্প।
এরকম :
ruby --jit app.rb
রুবি 2.6 জেআইটি-নির্দিষ্ট বিকল্পগুলির একটি সেটের সাথে আসে যা আমাদের এটি ঠিক কীভাবে কাজ করে তা আবিষ্কার করতে সহায়তা করবে। আপনি ruby --help
চালিয়ে এই বিকল্পগুলি দেখতে পারেন৷ .
এখানে বিকল্পগুলির একটি তালিকা রয়েছে৷
- –জিত-অপেক্ষা করুন
- –জিত-ভার্বোস
- –jit-save-temps
- –jit-max-cache
- –জিত-মিন-কল
এই বার্বোস বিকল্পটি একটি ভাল সূচনা পয়েন্টের মত দেখাচ্ছে!
এছাড়াও আমরা --jit-wait
ব্যবহার করতে যাচ্ছি , এটি রুবিকে এটি চালানোর আগে JIT কোডের সংকলন সম্পন্ন না হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য করে।
স্বাভাবিক অপারেশন চলাকালীন JIT একটি কর্মী থ্রেডে কোড কম্পাইল করে এবং এটি শেষ হওয়ার জন্য অপেক্ষা করে না।
এটি পরীক্ষা করতে আপনি যে কমান্ডটি চালাতে পারেন তা এখানে:
ruby --disable-gems --jit --jit-verbose=1 --jit-wait -e "4.times { 123 }"
এটি প্রিন্ট করে :
Successful MJIT finish
আচ্ছা, এটা খুব আকর্ষণীয় নয়, তাই না?
JIT কিছুই করছে না।
কেন?
কারণ ডিফল্টরূপে, যখন একটি পদ্ধতি 5 বার কল করা হয় তখনই JIT কার্যকর হয় (jit-min-calls
) বা আরও বেশি।
যদি আমরা এটি চালাই:
ruby --disable-gems --jit --jit-verbose=1 --jit-wait -e "5.times { 123 }"
এখন আমরা কিছু আকর্ষণীয় পেয়েছি :
JIT success (32.1ms): block in <main>@-e:1 -> /tmp/_ruby_mjit_p13921u0.cএ ব্লক করুন
এটা কি বলে?
JIT একটি ব্লক কম্পাইল করেছে কারণ আমরা এটিকে 5 বার কল করেছি, এটি আপনাকে বলে:
- কত সময় লেগেছে কম্পাইল করতে (
32.1ms
), - ঠিক কি সংকলিত হয়েছিল (
block in <main>
এ ব্লক করুন ) - যে ফাইলটি তৈরি করা হয়েছিল (
/tmp/_ruby_mjit_p13921u0.c
) এই সংকলনের উৎস হিসেবে
এই ফাইলটি হল সি সোর্স কোড যা একটি অবজেক্ট ফাইলে কম্পাইল করা হয়েছে (.o
) এবং তারপর একটি ভাগ করা লাইব্রেরি ফাইলে (.so
)।
আপনি --jit-save-temps
যোগ করলে এই ফাইলগুলিতে অ্যাক্সেস পেতে পারেন বিকল্প।
এখানে একটি উদাহরণ আছে :
কীভাবে JIT কাজ করে এই আমার বর্তমান উপলব্ধি :
- গণনা পদ্ধতি কল
- যখন একটি পদ্ধতি 5 বার কল করা হয় (ডিফল্ট
jit-min-calls
) ট্রিগার JIT - এই পদ্ধতির নির্দেশাবলী ধারণকারী একটি C ফাইল তৈরি করা হয়েছে (এগুলি YARV নির্দেশাবলী, কিন্তু ইনলাইনযুক্ত)
- সংকলন পটভূমিতে ঘটে (যদি না
--jit-wait
) একটি নিয়মিত সি কম্পাইলার ব্যবহার করে যেমন GCC - যখন কম্পাইলেশন করা হয় তখন শেয়ার করা লাইব্রেরি ফাইলটি ব্যবহার করা হয় যখন এই পদ্ধতিটি বলা হয়
দেখা যাক এটা কতটা কার্যকর।
MJIT পরীক্ষা করা:এটা কি সত্যিই দ্রুত?
MJIT এর লক্ষ্য হল রুবিকে দ্রুততর করা।
এটা এখন কতটা ভালো করছে?
আসুন জেনে নেওয়া যাক!
প্রথমত, মাইক্রোবেঞ্চমার্ক:
বেঞ্চমার্ক | ফলাফল (JIT ছাড়া রুবি 2.6 এর তুলনায়) |
---|---|
যখন | 8 গুণ দ্রুত |
স্ট্রিং যুক্ত করার সময় | 10% দ্রুত |
গুণ সহ (পূর্ণসংখ্যা) | 4x দ্রুত |
গুণ সহ (Bignum) | 20% ধীর |
স্ট্রিং আপকেস | 10% দ্রুত |
স্ট্রিং মিল | 2% ধীর |
স্ট্রিং মিল? | 10% দ্রুত |
10k র্যান্ডম সংখ্যা সহ অ্যারে | 20% দ্রুত |
মনে হচ্ছে পারফরম্যান্স সব জায়গাতেই আছে, কিন্তু কিছু একটা আছে যা থেকে আমরা অনুমান করতে পারি…
MJIT সত্যিই লুপ পছন্দ করে!
কিন্তু আরও জটিল অ্যাপ্লিকেশনের সাথে এটি কীভাবে ভাড়া দেয়?
চলুন একটি সাধারণ সিনাট্রা অ্যাপ দিয়ে চেষ্টা করি :
require 'sinatra' get '/' do "apples, oranges & bananas" end
এটি দেখতে খুব বেশি নাও লাগতে পারে, তবে এই সামান্য কোডটি 500 টিরও বেশি বিভিন্ন পদ্ধতিতে চলে। JIT কে কিছু কাজ দেওয়ার জন্য যথেষ্ট!
সুনির্দিষ্টভাবে বলতে গেলে, এটি হল সিনাট্রা 2.0.4 এর সাথে থিন 1.7.2।
আপনি এই কমান্ড দিয়ে বেঞ্চমার্ক চালাতে পারেন (apache বেঞ্চ):
ab -c 20 -t 10 https://localhost:4567/
এগুলি হল ফলাফল :
আপনি এগুলি থেকে বলতে পারেন যে রুবি 2.6 2.5 এর চেয়ে দ্রুত, কিন্তু JIT সক্ষম করা সিনাট্রাকে 11% ধীর করে তোলে !
কেন?
আমি জানি না, এটি JIT দ্বারা প্রবর্তিত ওভারহেডের কারণে হতে পারে বা কোডটি ভালভাবে অপ্টিমাইজ করা হয়নি৷
একটি সি প্রোফাইলার (কলগ্রিন্ড) দিয়ে আমার পরীক্ষায় দেখা যায় যে জেআইটি অপ্টিমাইজড কোডের ব্যবহার (সংকলিত সি ফাইল যা আমরা আগে আবিষ্কার করেছি) সিনাত্রার জন্য খুবই কম (2% এর চেয়ে কম ), কিন্তু এটি খুব বেশি (24.22% ) সময় বিবৃতির জন্য যা একটি 8x গতি বুস্ট পায়।
JIT এর সাথে থাকাকালীন বেঞ্চমার্কের ফলাফল :
JIT এর সাথে সিনাট্রা বেঞ্চমার্কের ফলাফল :
এটি কারণের অংশ হতে পারে, আমি একজন কম্পাইলার বিশেষজ্ঞ নই তাই আমি এ থেকে কোনো সিদ্ধান্তে আসতে পারছি না।
সারাংশ
MJIT একটি "জাস্ট-ইন-টাইম কম্পাইলার" রুবি 2.6 এ উপলব্ধ, এটি --jit
দিয়ে সক্ষম করা যেতে পারে পতাকা MJIT প্রতিশ্রুতিশীল এবং কিছু ছোট প্রোগ্রামের গতি বাড়াতে পারে, কিন্তু এখনও অনেক কাজ বাকি আছে!
আপনি যদি এই নিবন্ধটি পছন্দ করেন তবে এটি আপনার রুবি বন্ধুদের সাথে শেয়ার করতে ভুলবেন না 🙂
পড়ার জন্য ধন্যবাদ।