Ruby 2.5.0はどれだけ高速化したか(翻訳)

概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: How Fast is Ruby 2.5.0? — Appfolio Engineering 原文公開日: 2018/02/06 著者: Noah Gibbs サイト: Appfolio Engineering Ruby 2.5.0はどれだけ高速化したか(翻訳) 昨年11月に、Ruby 2.5.0 preview 1のスピード測定結果の記事を公開しました。そのときの結果はRuby 2.4よりかろうじて速い程度で、ほんのちょっぴりがっかりしました。しかし、2.5.0の完成直前になってパフォーマンス上極めて重要なパッチが登場し、最終的な速度が大きく変わりました。 どれだけ速くなったのでしょうか?早速見てみましょう。 グラフでの概要 グラフが見られればいいんですよねきっと?私もです。以下はRails Ruby Bench(RRB)で測定した総時間のグラフです。ここでは、Discourse(Rails)のさまざまなリクエストを巨大なコンカレントサーバーを介してプッシュするのに要した時間を測定しています。 うぐ、グラフの右側が短いんでないかい? 総じて悪くない結果です。では数値とパーセントの表にしてみたらどのぐらい速くなったように見えるでしょうか? パーセンタイル Ruby 2.4.3 Ruby 2.5.0 高速化(%) 0% 29.17 26.99 7.5% 10% 32.25 30.73 4.7% 50% 33.98 32.39 4.7% 90% 35.15 33.37 5.1% 100% 36.77 35.62 3.1% ここで興味深いのは、数値が大きい(速度が遅い)実行結果ほど高速化の度合いが小さくなっている点です。こういう挙動はなかなか見かけません。ほぼすべての高速化で度合いの違いが生じた原因は、今回のパフォーマンスパッチのこの珍しい性質によるものであることはほぼ確実でしょう。この違いは多かれ少なかれ、Rubyバイトコード操作ごとの定数におけるオーバーヘッドによるものです。遅い実行に含まれるインストラクションの実行時間が長くなる(ようである)と、パフォーマンスの改善度合いが鈍ると考えられそうです。だいたいご覧のとおりの結果です。 「なるほど、でもトータルではどうなの?Ruby 2.5.0は結局どれだけ速くなったの?」と質問されたときのために、実行時間ごとのパーセンタイルではなく、スループットで取り急ぎ回答してみようと思います。スループットを見てみましょう。 測定 Ruby 2.4.3 Ruby 2.5.0 % Faster スループット(平均値) 170.6 179.3 5.1% スループット(中間値) 171.0 179.6 5.0% 「どれだけ速くなったの?」への回答は、「巨大なコンカレントRailsサーバーで5%スループットが高速化した」です。お友だちにも教えてやってください。 「もっと速くなる?」もちろんです。多数の小さな操作が高速化したことで、Railsのリクエストが最大で7.5%高速化したのを眼にしました。また、Koichiはいくつかのベンチマークで12%高速化したのを見たそうです。 「これでワイのRailsアプリはもっと速くなるの?」は、要するに「イエス」です。5%高速化します。互換性が失われる可能性の低い、静かめのアップグレードとしてはまずまずの出来です。コードはとにかく高速になりますし、うれしい機能がいくつも追加されています! 関連記事 Ruby 3 JITの最新情報: 現状と今後(翻訳) 米国から見た日本のRuby事情(翻訳)