JRuby on Rails กับ Ruby on Rails ต่างกันอย่างไร?


137

ฉันกำลังจะลองใช้ JRuby และ JRuby บน Rails ฉันมีปัญหาในการค้นหาข้อมูลว่าความแตกต่างระหว่าง JRuby on Rails และ Ruby on Rails คืออะไร

อะไรคือความแตกต่างที่ฉันต้องระวัง?

คำตอบ:


162

JRuby คือการใช้งาน Ruby ที่ทำงานบน JVM ในขณะที่ Matz's Ruby เป็นการใช้งาน C

คุณสมบัติหลักที่ควรทราบ ได้แก่ :

  1. JRuby ทำงานบน Java VM และคอมไพล์หรือตีความเป็นโค้ด Java byte
  2. JRuby สามารถทำงานร่วมกับโค้ด Java ได้ หากคุณมีไลบรารีคลาส Java (.jar's) คุณสามารถอ้างอิงและใช้งานได้จากภายใน Ruby code กับ JRuby ในอีกทางหนึ่งคุณสามารถเรียกรหัส JRuby จากภายใน Java ได้ JRuby ยังสามารถใช้ความสามารถของ JVM และแอ็พพลิเคชันเซิร์ฟเวอร์
  3. โดยปกติ JRuby จะโฮสต์ภายในเซิร์ฟเวอร์แอปพลิเคชัน Java เช่น Sun's GlassFish หรือแม้แต่เว็บเซิร์ฟเวอร์ Tomcat
  4. แม้ว่าคุณจะไม่สามารถใช้อัญมณี Ruby ดั้งเดิมกับ JRuby ได้ แต่ก็มีการใช้งาน JRuby สำหรับไลบรารี Ruby ยอดนิยมส่วนใหญ่

มีความแตกต่างอื่น ๆ ที่ระบุไว้ใน JRuby wiki:


ขอบคุณที่ตอบทุกอย่างที่ฉันกำลังมองหา :)
epochwolf

4
โอ้และมันทำงานช้ากว่า 1.9
เล็กน้อย

1
หากต้องการดูความแตกต่างด้านประสิทธิภาพใน JRuby on Rails ขอแนะนำให้มีเครื่องหลากสีที่มีทรัพยากรเพียงพอ การสืบค้นฐานข้อมูลที่ช้าอาจทำให้ JRuby เกิดปัญหาคอขวดและทำให้ทำงานได้ใกล้เคียงหรือช้ากว่า MRI บน Rails JRuby ยังใช้หน่วยความจำล่วงหน้ามากกว่า MRI อย่างมีนัยสำคัญ
Joseph Ravenwolfe

เรามีทั้งประสิทธิภาพที่ยอดเยี่ยมเมื่อใช้ jruby กับ Oracle ผ่าน VPN (การทดสอบทำงานช้าอย่างไม่น่าเชื่อ) และในเครื่อง (ไม่มี VPN) เพียงแค่เริ่มทับทิมคอนโซลราง ฯลฯ ใช้เวลา 30 วินาที + แทนที่จะเป็น 3
Michael Durrant

60

ฉันประหลาดใจมีเป็นสิ่งที่สำคัญที่ขาดหายไปในทุกคำตอบสำหรับคำถามนี้เกี่ยวข้องกับGIL

ความแตกต่างหลักที่คุณควรใส่ใจเกี่ยวกับ esp ในเว็บแอปพลิเคชันเช่นตัวที่สร้างด้วย Rails เป็นแบบพร้อมกันจริง ("Global Interpreter Lock" ฟรี) เมื่อสองเธรดกำลังทำงาน (เช่นให้บริการคำขอของผู้ใช้ 2 รายการ) ด้วย JRuby พวกเขาจะสามารถทำงานพร้อมกันภายในกระบวนการเดียวในขณะที่ใน MRI มี GIL (แม้จะมีเธรดเนทีฟของ 1.9) ที่หลีกเลี่ยงการรันโค้ด Ruby ในแบบคู่ขนาน

สำหรับนักพัฒนาแอปพลิเคชันสิ่งนี้เป็นสิ่งแรกที่ควรคำนึงถึงในขณะที่พิจารณา JRuby เนื่องจากเป็นสิ่งที่โดดเด่นconfig.threadsafe!แต่ต้องการให้คุณตรวจสอบให้แน่ใจว่ารหัสของคุณ (และรหัสอัญมณีของคุณ) ปลอดภัยต่อเธรดอย่างแท้จริง


7

ฉันอาจจะผิด แต่ฉันคิดว่าคุณสามารถแพคเกจแอพ JRuby บน Rails ในแบบที่คุณไม่สามารถทำได้กับ RoR ปกติ - ดู Mingle หรือคล้ายกัน ทำให้ขายได้โดยไม่ต้องทิ้งกางเกง / เปิดโคโมโนะ

ที่กล่าวว่าฉันไม่คุ้นเคยกับบรรจุภัณฑ์ RoR เพียงพอดังนั้นอย่าถือฉันไว้ :)


1
คุณถูกต้องอย่างแน่นอนในเรื่องนี้แม้ว่าคุณจะต้องมีบางอย่างเช่นอัญมณี Rawr หรือ Roir เพื่อทำสิ่งนี้ให้สมบูรณ์ (ครั้งสุดท้ายที่ฉันใช้ Mingle มันมีไฟล์ Ruby ที่ไม่สับสน
Marnen Laibow-Koser

3

ส่วนใหญ่ควรใช้งานได้เหมือนกัน ใน jRoR คุณสามารถเข้าถึงสิ่งที่คุณไม่มีใน RoR โดยปกติแล้วส่วนใหญ่เป็นเรื่องการปรับใช้

อย่างไรก็ตามหากแอป RoR ของคุณใช้ไลบรารีเนทีฟที่ไม่มีเทียบเท่าที่รันบน JVM นั่นอาจเป็นความเจ็บปวด อย่างไรก็ตาม libs ส่วนใหญ่มีเวอร์ชันที่ไม่ใช่เนทีฟ (อย่างน้อยก็เป็นเวอร์ชันยอดนิยมที่ฉันเจอ)


1

มีคำตอบที่ดีอยู่แล้ว

eebbesen ได้กล่าวถึงพื้นฐานแล้วและคาเรส (ตัวเขาเอง!) ได้บอกเราว่า JRuby ไม่มี GIL

ฉันจะเพิ่มจากมุมมองที่เป็นประโยชน์มากขึ้นฉันได้เปิดตัวแอปบน Ruby on Rails แล้วย้ายไปที่ JRuby ด้วยเหตุผลด้านประสิทธิภาพ

มีประโยชน์ด้านประสิทธิภาพหลักสองประการ: JRuby (หรือเป็น) เร็วกว่า Ruby ในบางสถานการณ์และสองประการคือการขาด Global Interpreter Lock kares ที่กล่าวถึงทำให้ฉันสามารถทำมัลติเธรดได้ซึ่งในขณะที่คำสั่งปลดล็อกคำสั่งของผลประโยชน์ขนาดใหญ่ที่ยุ่งยาก .

แอพ Ruby on Rails ขนาดใหญ่มากพอร์ตและทำงานในหนึ่งชั่วโมงอัญมณีและทั้งหมด ความผิดพลาดเพียงอย่างเดียวคือ regexes ของ Java แตกต่างจาก Ruby เล็กน้อย นั่นเป็นความสำเร็จที่ยิ่งใหญ่ในส่วนของ JRuby

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.