Ich versuche den praktischen Einfluss verschiedener Threading-Modelle zwischen MRI Ruby 1.8 und JRuby zu verstehen.
Was bedeutet dieser Unterschied für mich als Entwickler?
Und gibt es auch praktische Beispiele für Code in MRI Ruby 1.8, die aufgrund verschiedener Threading-Modelle schlechtere Leistungsmerkmale auf JRuby haben werden?
Ein Thread-Programm, das auf einer 2-Kern-CPU ausgeführt wird, läuft schneller auf JRuby als auf den anderen Implementierungen, was den Thread-Sichtpunkt betrifft
Viele bestehende Ruby-Bibliotheken sind nicht threadsicher, so dass der Vorteil von JRuby in vielen Fällen nutzlos ist.
Beachten Sie auch, dass viele Techniken der Ruby-Programmierung (z. B. Klassenvars) zusätzlichen Programmieraufwand benötigen, um die Thread-Sicherheit (Mutex-Sperren, Monitore usw.) zu gewährleisten, wenn Threads verwendet werden sollen.
JRubys Threads sind native Systemthreads und bieten Ihnen alle Vorteile der Thread-Programmierung (einschließlich der Verwendung mehrerer Prozessorkerne, falls zutreffend). Ruby verfügt jedoch über eine globale Interpretersperre (GIL), die verhindert, dass mehrere Threads gleichzeitig ausgeführt werden. Der einzige wirkliche Leistungsunterschied ist die Tatsache, dass Ihre MRI / YARV-Ruby-Anwendungen nicht in der Lage sein werden, alle Ihre Prozessorkerne zu nutzen, aber Ihre JRuby-Anwendungen werden dies gerne tun.
Wenn das jedoch kein Problem ist, sind MRT-Threads (theoretisch habe ich das nicht getestet) etwas schneller, weil sie grüne Threads , die weniger Systemressourcen verbrauchen. YARV (Ruby 1.9) verwendet native Systemthreads.
Ich bin ein normaler JRuby-Benutzer und der größte Unterschied ist, dass JRuby-Threads wirklich gleichzeitig sind. Sie sind tatsächlich Threads auf Systemebene, sodass sie gleichzeitig auf mehreren Kernen ausgeführt werden können. Ich kenne keinen Ort, wo MRI Ruby 1.8-Code auf JRuby langsamer läuft. Sie können sich diese Frage vielleicht einmal ansehen Hat Ruby echtes Multithreading? .
Tags und Links ruby multithreading jruby