2 पॉइंट द्वारा GN⁺ 2024-12-06 | 1 टिप्पणियां | WhatsApp पर शेयर करें

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 टिप्पणियां

 
GN⁺ 2024-12-06
Hacker News राय
  • लूप उदाहरण 1 अरब बार दोहराया जाता है और nested loops का उपयोग करता है। अनुमान है कि यह benchmark पहली दो पंक्तियों में 99% से अधिक समय खर्च करेगा

    • array elements के लिए liveness analysis के माध्यम से पूरे outer loop को हटाया जा सकता है, और प्रोग्राम को सरल रूप से बदला जा सकता है
    • जिज्ञासा है कि क्या compiler इस तरह का analysis कर सकता है
    • भले ही u compile time पर ज्ञात न हो, inner loop को कुछ instructions से बदला जा सकता है
  • Ruby के भविष्य के versions का उल्लेख है, और Ruby 3.4.0 इस क्रिसमस पर, Ruby 3.5.0 अगले क्रिसमस पर रिलीज़ होने वाला है

    • जिज्ञासा है कि Python का minimal JIT ऐसे loops पर क्या प्रभाव डालेगा
    • Python 3.13 को JIT enabled अवस्था में build करना होगा, और उसके साथ benchmark चलाकर देखना दिलचस्प होगा
  • Ruby के लिए लगाव अब भी बना हुआ है। Matz को धन्यवाद

  • Integer#succ के performance improvement PR की चर्चा 2024 की शुरुआत में हुई थी, और इससे समझ में आता है कि Integer#succ का उपयोग क्यों किया जाता है

    • loop methods को फिर से लिखते समय Integer#succ का उपयोग किया जाता है, और interpreter में opt_succ (i = i.succ) को putobject 1; opt_plus (i += 1) की तुलना में तेज़ी से संभाला जाता है
    • निजी तौर पर, readability के कारण मैं अक्सर #succ का उपयोग करता हूँ, और UUID library की #bytes method में इसे दो बार उपयोग करके कोड पढ़ते समय "bit slicing mode" बनाए रखता हूँ
  • TruffleRuby से जुड़ा अनुभव साझा किया गया, जिसमें TruffleRuby को Node.js से तेज़ और Bun या Golang के काफ़ी करीब बताया गया

    • यह स्पष्ट नहीं है कि दिया गया benchmark बदलाव के बाद की TruffleRuby speed दिखाता है या नहीं
    • benchmark को verify करके main repository में commit के रूप में जोड़ना चाहूँगा
  • Ruby बहुत तेज़ हो गई है, और TruffleRuby तो और भी प्रभावशाली है

  • यह नहीं पता था कि YJIT को Rust में लिखा गया था

  • benchmark में Python सबसे धीमी भाषा थी, लेकिन अक्टूबर 2024 तक Github पर वही सबसे अधिक इस्तेमाल की जाने वाली भाषा है

    • लगता है कि भाषा की धीमी गति और उसकी लोकप्रियता के बीच कुछ संबंध है
  • अधिक भाषाओं को शामिल करने वाला एक पुराना language comparison repository मौजूद है

  • इसने Advent of Code solutions में बड़ा बदलाव लाया, और यह हैरान करने वाली हद तक समान दिखता है