Ruby के प्रदर्शन में सुधार: C को Ruby में फिर से लिखना
Ruby के प्रदर्शन की तुलना
- हाल की language comparison repository में Ruby को R और Python से तेज़, लेकिन तीसरी सबसे धीमी भाषा के रूप में आंका गया।
- benchmark दो हिस्सों, "Loops" और "Fibonacci", से बना है, जो क्रमशः loop और conditional statements, function call overhead, तथा recursion performance को उजागर करते हैं।
Ruby और Node.js के प्रदर्शन की तुलना
- M3 MacBook Pro पर Ruby 3.3.6 को loop उदाहरण में 28 सेकंड और Fibonacci उदाहरण में 12 सेकंड लगे।
- Node.js ने दोनों उदाहरण लगभग 1 सेकंड में पूरे किए।
- M2 MacBook Air पर Ruby का प्रदर्शन और खराब था।
benchmark का मतलब
- ऐसे benchmark वास्तव में बहुत मायने नहीं भी रख सकते हैं।
- Python को सबसे धीमी भाषा के रूप में आंका गया, लेकिन GitHub पर वही सबसे ज़्यादा इस्तेमाल की जाने वाली भाषा है।
- programming language का efficient होना ज़रूरी है, लेकिन उसकी usefulness और productivity, performance से ज़्यादा महत्वपूर्ण हैं।
YJIT का उपयोग
- YJIT लागू करने पर Fibonacci का प्रदर्शन काफ़ी बेहतर हो जाता है।
- loop उदाहरण में प्रदर्शन सुधार बहुत मामूली है।
Ruby कोड optimization
Range#each C में लिखा गया है, इसलिए YJIT इसे optimize नहीं कर सकता।
Integer#times को Ruby 3.3 में C से Ruby में बदला गया, जिससे YJIT optimization संभव हुआ।
Array#each को Ruby 3.4 में C से Ruby में बदला गया।
Integer#times optimization
Integer#succ, i += 1 की तुलना में तेज़ काम करता है।
- YJIT,
Integer#times को optimize करके प्रदर्शन को काफ़ी बढ़ाता है।
Array#each optimization
Array#each को Ruby 3.4 में C से Ruby में बदला गया, जिससे YJIT optimization संभव हुआ।
Primitive module का उपयोग करके Ruby में C कोड का मूल्यांकन किया जाता है।
Ruby Microbench repository
- अलग-अलग Ruby versions और YJIT के साथ benchmark चलाए गए।
- Ruby 3.4 YJIT में प्रदर्शन काफ़ी बेहतर है।
range#each optimization
Range class को pure Ruby में लागू करके प्रदर्शन सुधारा जा सकता है।
YJIT standard library
- YJIT टीम, C कोड को Ruby से बदलकर प्रदर्शन सुधार रही है।
with_yjit block का उपयोग करके, YJIT enabled होने पर Ruby implementation इस्तेमाल की जाती है।
YJIT optimization की जाँच
- YJIT, Ruby VM bytecode को machine code में बदलकर प्रदर्शन optimize करता है।
Integer#succ के machine code का विश्लेषण करके YJIT की optimization प्रक्रिया को समझा जाता है।
1 टिप्पणियां
Hacker News राय
लूप उदाहरण 1 अरब बार दोहराया जाता है और nested loops का उपयोग करता है। अनुमान है कि यह benchmark पहली दो पंक्तियों में 99% से अधिक समय खर्च करेगा
ucompile time पर ज्ञात न हो, inner loop को कुछ instructions से बदला जा सकता हैRuby के भविष्य के versions का उल्लेख है, और Ruby 3.4.0 इस क्रिसमस पर, Ruby 3.5.0 अगले क्रिसमस पर रिलीज़ होने वाला है
Ruby के लिए लगाव अब भी बना हुआ है। Matz को धन्यवाद
Integer#succके performance improvement PR की चर्चा 2024 की शुरुआत में हुई थी, और इससे समझ में आता है किInteger#succका उपयोग क्यों किया जाता हैInteger#succका उपयोग किया जाता है, और interpreter मेंopt_succ (i = i.succ)कोputobject 1; opt_plus (i += 1)की तुलना में तेज़ी से संभाला जाता है#succका उपयोग करता हूँ, और UUID library की#bytesmethod में इसे दो बार उपयोग करके कोड पढ़ते समय "bit slicing mode" बनाए रखता हूँTruffleRuby से जुड़ा अनुभव साझा किया गया, जिसमें TruffleRuby को Node.js से तेज़ और Bun या Golang के काफ़ी करीब बताया गया
Ruby बहुत तेज़ हो गई है, और TruffleRuby तो और भी प्रभावशाली है
यह नहीं पता था कि YJIT को Rust में लिखा गया था
benchmark में Python सबसे धीमी भाषा थी, लेकिन अक्टूबर 2024 तक Github पर वही सबसे अधिक इस्तेमाल की जाने वाली भाषा है
अधिक भाषाओं को शामिल करने वाला एक पुराना language comparison repository मौजूद है
इसने Advent of Code solutions में बड़ा बदलाव लाया, और यह हैरान करने वाली हद तक समान दिखता है