なぜ人々はRubyが遅いと言うのですか?[閉まっている]


184

Ruby on Railsが好きで、すべてのWeb開発プロジェクトで使用しています。数年前、Railsが記憶を独り占めしていることや、拡張性があまりよくないことについて多くの話がありましたが、これらの提案は、Gregg Pollackによってここに公開されました

でも最近は、Ruby自体が遅いという話を聞いています。

  • Rubyが遅いと見なされるのはなぜですか?

Rubyが遅いとは思いませんが、単純なCRUDアプリや会社のブログを作成するために使用しています。Rubyが遅くなる前に、どのようなプロジェクトを実行する必要がありますか?それとも、この遅さはすべてのプログラミング言語に影響を与えるものですか?

  • この「遅さ」に対処したい場合、Rubyプログラマーとしてどのような選択肢がありますか?

  • 速度が重要でトラフィックが激しいStack Overflowのようなアプリケーションに最適なRubyのバージョンはどれですか。

質問は主観的であり、私はアーキテクチャのセットアップ(EC2とスタンドアロンサーバーなど)が大きな違いをもたらすことを理解していますが、Rubyの処理速度が遅いことについての人々の意見を聞きたいです。

最後に、Ruby 2.0について多くのニュースを見つけることができません。それから、それから数年が経ちました。




すばらしい答えを除いて、それらはどれも実際にはなぜ答えません。より良い洞察は、Nakilonによって言及された関連質問にあります
Andre Figueiredo

回答:


184

Rubyが遅いと見なされるのはなぜですか?

Rubyと他の言語の間で典型的なベンチマークを実行すると、Rubyは失われるからです。

Rubyが遅いとは思いませんが、単純なCRUDアプリや会社のブログを作成するために使用しています。Rubyが遅くなる前に、どのようなプロジェクトを実行する必要がありますか?それとも、この遅さはすべてのプログラミング言語に影響を与えるものですか?

Rubyは、リアルタイムのデジタル信号処理アプリケーションや、あらゆる種類のリアルタイム制御システムを作成する上で、おそらく役に立たないでしょう。Ruby(今日のVMを使用)は、スマートフォンなどのリソースに制約のあるコンピューターではおそらく窒息するでしょう。

Webアプリケーションの処理の多くは、実際にはCで開発されたソフトウェアによって行われます。たとえば、Apache、Thin、Nginx、SQLite、MySQL、PostgreSQL、多くの解析ライブラリ、RMagick、TCP / IPなどは、Rubyで使用されるCプログラムです。 。Rubyは接着剤とビジネスロジックを提供します。

この「遅さ」に対処したい場合、Rubyプログラマーとしてどのような選択肢がありますか?

より高速な言語に切り替えます。しかし、それにはコストがかかります。それは価値があるかもしれない費用です。しかし、ほとんどのWebアプリケーションでは、言語の選択は重要な要素ではありません。高速な言語を使用して正当化できる十分なトラフィックがないため、開発に多くの費用がかかるからです。

速度が重要でトラフィックが激しいStack Overflowのようなアプリケーションに最適なRubyのバージョンはどれですか。

他の人々はこれに答えました-JRuby、IronRuby、REEは、VMを購入できるプラットフォームでアプリケーションのRuby部分をより高速に実行します。また、低速になる原因はRubyではないことが多いため、コンピューターシステムアーキテクチャとアプリケーションアーキテクチャにより、データベースレプリケーション、複数のアプリケーションサーバー、リバースプロキシによる負荷分散、HTTPキャッシング、memcache、Ajax、クライアント側キャッシングなどを実行できます。 。これらはRubyではありません。

最後に、Ruby 2.0について多くのニュースを見つけることができません。それから、それから数年が経ちました。

ほとんどの人がRuby 1.9.1を待っています。私自身、JRuby上のRuby 1.9.1上のRails 3.1を待っています。

最後に、多くの開発者がRubyを選択していることを忘れないでください。Rubyを使用すると、プログラミングが他の言語に比べてより楽しい体験になります。また、Ruby with Railsを使用すると、熟練したWeb開発者がアプリケーションをすばやく開発できます。


3
十分に検討した結果、これが最良の回答であると判断しました。おかげで、私は信号処理アプリについてのアナロジーが好きです。これらの役立つ答えをすべて受け取った後、人々が今何について話しているかを確認するのは簡単です。
スティーブンマードック

1
はい、あなたはruby 2から数年離れてい
モーガン

3
Ruby 2.1を使用した私の経験は、Ruby 2.0で実行している同じアプリよりも約25%速いということです
Matt Connolly 2014年

14
言語は低速でも高速でもありません。その実装、インタープリター、コンパイラーは次のとおりです:)
Zelphir Kaltstahl

122

まず第一に、何に関して遅いのでしょうか?C?Python?Computer Language Benchmarks Gameいくつかの数字取得しましょう:

Rubyが遅いと見なされるのはなぜですか?

あなたが尋ねる人に依存します。あなたはそれを知ることができます:

  • Rubyはインタプリタ言語であり、インタプリタ言語はコンパイルされたものよりも遅くなる傾向があります
  • Rubyはガベージコレクションを使用します(ただし、C#もガベージコレクションを使用しますが、上記のよりアルゴリズム的でメモリ割り当てをあまり必要としないベンチマークでは、Ruby、Python、PHPなどよりも2桁優れています)。
  • Ruby メソッドの呼び出しは遅い(ただし、アヒルの型付けのため、強く型付けされたインタプリタ言語よりも間違いなく高速です)
  • Ruby(JRubyを除く)真のマルチスレッドをサポートしていません

しかし、もう一度、何に関して遅いのですか?Ruby 1.9は、C(最大300倍高速になる可能性があります)と比較した場合、PythonおよびPHP(パフォーマンス係数の3倍以内)とほぼ同じなので、上記の(スレッドの考慮事項を除いて、アプリケーションがこの側面に大きく依存している場合) )は主に学術的です。

この「遅さ」に対処したい場合、Rubyプログラマーとしてどのような選択肢がありますか?

スケーラビリティを考慮して書き込み、ハードウェアを追加します(メモリなど)。

速度が重要でトラフィックが激しいStack Overflowのようなアプリケーションに最適なRubyのバージョンはどれですか。

まあ、REEPassengerと組み合わせたもの)は非常に良い候補です。


1
ガベージコレクション自体は必ずしも低速ではありませんが、MRIのガベージコレクションは低速です。より高速なRubyが必要な場合は、REEだけでなくJRubyも確認できます。
Andreas

1
@igouy、真、2008年半ばは極端だったかもしれません。リンクを更新しましたが、数か月後には古くなります。:)どちらの方法でも、ハードウェアといくつかのパッチレベルが異なっている可能性があり、いくつかの追加テストが追加されましたが、全体像は変わりませんでした。
vladr 2010年

11
>>同じ桁の範囲内にある<< 7まで生きているか69まで住んでいる場合、同じ桁内にあります。その違いは重要ではありませんか?
igouy 2010年

10
@igouy、私はあなたのことは知りませんが、実行速度の観点から私の寿命を測定するプログラムではありません。たとえば、実行速度を重視するのは、HTTP応答のレンダリング時間です。7ミリ秒と69ミリ秒のレンダリング時間の違いに気付かないことを知っています(特に、130ミリ秒のネットワーク遅延に乗っている場合)。私は7ミリ秒と700ミリ秒の違いに気付くことを知っています。また、7ミリ秒と7ミリ秒の違いは確かにわかりますが、7ミリ秒と69ミリ秒の違いはありません。
vladr 2014

3
@ vladr、70msまたは700msはどうですか?その違いに気付くことができますか?
Paul Draper

60

Railsの作成者であるDavid Heinemeier Hanssonのコメントは次のとおりです。

Rails [Ruby]は、Webアプリケーションの大部分を対象としたFast Enoughです。1日に何百万もの動的ページビューを実行するサイトがありました。最終的にYahooまたはAmazonのフロントページが表示される場合、既成のフレームワークですべての言語を使用しても、それほど効果はありません。おそらく、自分でロールする必要があります。しかし、確かに、私も無料のCPUサイクルが欲しいです。私はたまたま、無料の開発者サイクルについてずっと気にし、前者を後者と交換することをいとわないのです。

つまり、問題により多くのハードウェアやマシンを投入する方が、より多くの開発者を雇ってより速く、しかし言語を維持するのが難しいよりも安価です。結局のところ、CでWebアプリケーションを作成する人はほとんどいません。

Ruby 1.9は1.8よりも大幅に改善されています。Ruby 1.8の最大の問題はその解釈された性質(バイトコードなし、コンパイルなし)であり、Rubyで最も一般的な操作の1つであるメソッド呼び出しは特に遅いです。

Rubyのメソッド検索がほとんどすべてであるということは役に立ちません。2つの数値を追加し、配列にインデックスを付けます。他の言語がハッキング(Pythonの__add__メソッド、Perlのoverload.pm)を公開している場合、Rubyはすべての場合に純粋なOOを実行します。これは、コンパイラー/インタープリターが十分に賢くない場合、パフォーマンスを低下させる可能性があります。

Rubyで人気のWebアプリケーションを作成している場合、私の焦点はキャッシングです。ページをキャッシュすると、使用している言語に関係なく、そのページの処理時間がゼロになります。Webアプリケーションの場合、データベースのオーバーヘッドやその他のI / Oは言語の速度よりもずっと重要になり始めるので、それを最適化することに焦点を当てます。


7
「結局のところ、CでWebアプリケーションを書く人はほとんどいません。」-もちろん、そうではありませんが、パフォーマンスを重視する多くのWebサイトは、たとえばScalaに移動しました。
ダリオ

6
「より多くのハードウェアを投入する」ことの方が安いことに同意しません。プラットフォームは開発者向けに設計されているため、Xか月ごとにホスティングに追加料金を支払う必要があることを顧客に納得させるのは困難です。
Kevin

9
@Keven:開発コストは確実に削減されますか?それ以外の場合、そもそもRubyを使用する意味は何でしょうか?
rjh

4
@Kevinそのステートメントは少し広いです。10%程度のトラフィック増加ごとに新しいサーバーをセットアップする必要がある場合、1日あたり約100回の訪問があり、顧客は明らかに不満を言う権利を持っています。ただし、現実的には、古いハードウェアが対応できなくなる前に、通常、最初に多くのトラフィックを増やし、それを1桁増やす必要があります。その時点で、トピックは「良い問題」の領域に移り、ハードウェアのアップグレードについて誰も不満を言うことはほとんどありません。また、「顧客」は、このようなことを意識せずにこのような高トラフィックのWebサイトを実行することはありません。
だます

5
@ケビン-それを逆にしましょう。「プラットフォームはコンピューターを念頭に置いて設計されているため、新機能がリリースされるまで3か月待つべきだと顧客に納得させるのは難しい。」その新機能によって収益が大幅に増加する場合は、追加のハードウェアの費用がかかります。その上、最初から高速言語を選択することは、多くのアプリケーションにとって、時期尚早な最適化です。可能性としては、データベースの読み取り、ネットワーク遅延など、ボトルネックがどこか別の場所にある可能性があります
Nathan Long

34

コードの作成が遅い。コードの読み取りが遅い。バグの発見と修正には時間がかかります。機能や拡張機能の追加には時間がかかります。以前のものを改善したものはすべて勝利です。実行パフォーマンスが問題になることはほとんどありません。


30
@GregS:ユーザビリティに影響を与える場合、実行パフォーマンスは常に問題です。確かに、1秒または3秒でxmlファイルの文字列をスキャンすることは、純粋な数値の観点からは重要ではありませんが、ユーザー向けのアプリケーションについて話している場合、数秒の違いがユーザビリティに大きな違いをもたらす可能性があります。
Bryan Oakley

5
@Ajax:いや、それはあなたの勝利の性格だと思います。
ジェームズK.ポーク大統領

15
これまでの私の記録は、1日の作業で会社に年間30,000ドルを節約しています。彼らのエンジニアは、クラウドコンピューティングアルゴリズムで各反復で実行されたタスクの数をカウントする方が読みやすく、nが原因であると判断しました。20,000以上の作業単位を持つジョブに対するクエリ。これを変更して、1つの作業項目が残っているかどうかを確認するためにそれをn個のクエリにドロップし、請求額を1日あたり$ 130から$ 20 /日に削減しました。怠惰なコーダーは私にお金を稼ぎます。より怠惰なコーダーを奨励してください。
Ajax 2013年

10
おもしろいことに今コメントしました...私は別の会社に移りました。そこでは、アメリカの大手銀行がシステムまで数百万ドルの契約に署名することを拒否したため、15人の開発者を機能から引き離さなければならなかっただけです。彼らの負荷を処理することができます。彼らは、私たちが持っている機能を気に入っており、実行速度だけではありません。十分に長い間パフォーマンスを無視する場合は、機能が異常に遅くなるため、どの機能を使用していてもかまいません。
Ajax

4
実行パフォーマンスは常に問題であり、私たちが話している問題はどれだけの問題なのかです。バッテリーを消費してユーザーがアプリの購入をやめる前に、どのくらいのコードを携帯電話で実行できますか?ユーザーは、ページが読み込まれるのを待ってから、広告を閉じて広告収入を奪います。これらの種類の質問に答えると、実行パフォーマンスがどれほど重要かがわかります。
Sqeaky

15

答えは簡単です。他の言語との比較による測定で遅いため、ルビーは遅いと言われています。ただし、「遅い」は相対的なものであることに注意してください。多くの場合、ルビーやその他の「遅い」言語は十分に高速です。


ええ、それは私が考えていたものです、つまり、人々はそれが遅いと言いますが、それでも私の要件には迅速です...
stephenmurdoch

11
>>それは私の要件に対してはまだ速いです<<高速である必要のないすべてのものに対して十分に高速です:-)
igouy

私は部分的にこれにバイアスをかけています、多分これは古いコメントです。これでruby 2.3ができました。ruby2.2の経験から、railsスタックが重いことがわかりました。より高速なフレームワークが必要な場合は、sinatraをベースにしたpidranoを試してみてください。そして、Railsコマンドにできるだけ近づけるようにしましたが、はるかに軽量です。しかし、それらはまだバージョン1.0に達しておらず、まだまだ続きますが、私のテストから、それは素晴らしく高速に実行されます。私はアクティブレコード5と、レールから借りたpidranoスプロケットで作業しました。200の同時接続で、dbクエリなしで1.5秒の応答が得られます。スプロケットからのアセットが含まれています
James Tan

5

Joel on Software-Ruby Performance Revisitedが それをよく説明しています。時代遅れかもしれませんが...

Ruby on Railsに慣れているので、そのまま使用することをお勧めします。
パフォーマンスの問題が発生した場合は、別の言語とフレームワークを使用することを再考するかもしれません。

その場合、C#とASP.NET MVC 2を併用することをお勧めします。これはCRUDアプリで非常にうまく機能します。


リンクをありがとう、私はいつもジョエルの物事を読むのが好きです。DHHの「バンパーステッカースローガン」についての興味深い発言...
スティーブンマードック

引用:「これはすべての人に当てはまるわけではありませんが、Rubyにパフォーマンスの問題があるとか、コアのRuby言語エンジンが実行できるよりも速くコードを実行できる必要があると人々が言っ​​たとき、それは役に立ちませんRubyは、開発者サイクルとCPUサイクルについて賛美歌を歌うことを提唱しています。
Marc.2377

3

Rubyは遅いと思います。インタプリタを高速化するために多くの努力が費やされていないからです。同じことがPythonにも当てはまります。SmalltalkはRubyやPythonと同じくらい動的ですが、パフォーマンスは大幅に向上します。http://benchmarksgame.alioth.debian.orgを参照してください。Smalltalkは多かれ少なかれJavaとC#(少なくとも10年前)に置き換えられたため、パフォーマンスの最適化作業は行われず、SmalltalkはRubyおよびPythonよりもはるかに高速です。Xerox ParcとOTI / IBMの人々は、Smalltalkの高速化に取り組む人々にお金を払うことができました。私が理解していないのは、GoogleがPythonを大規模に販売しているため、Pythonを高速化するためにお金をかけない理由です。代わりに、彼らはGoのような言語の開発にお金を費やしています...


それは、Pythonがすでにその場所を占めており、最近は頻繁に使用されているためだと思います。高いパフォーマンスが必要な場合は、使用または織り込み可能な多くのライブラリーや、使用可能なその他のものがあります。
Zelphir Kaltstahl、2015

私が読んだことから、Ruby 2.5でいくつかの努力がすでに良い結果をもたらしています。
Marc.2377

2

まず、あなたが好きな言語について他の人が言うことを気にしますか?それがしなければならない仕事をするとき、あなたは元気です。

OOはコードを実行する最速の方法ではありませんが、コードの作成には役立ちます。スマートコードは常に、ダムコードや無用のループよりも高速です。私はDBAであり、これらの無用なループの多くを見て、それらを削除し、より優れたコードとクエリを使用すると、アプリケーションがより高速に、より高速に実行されます。最後のマイクロ秒を気にしますか?速度に合わせて最適化された言語があるかもしれませんが、他の人は彼らがしなければならない仕事をするだけで、多くの異なるプログラマーによって維持することができます。

それはすべて単なる選択肢です。


2

明らかに、Rubyが失う速度について話します。ベンチマークテストでは、RubyはPHPほど遅くないことが示されています。しかし、見返りに、メンテナンスが容易なDRYコードを入手できます。これは、さまざまな言語のすべてのフレームワークの中で最高のものです。

小規模なプロジェクトの場合、コードで複雑な計算が使用されておらず、主流のものだけが使用されているので、遅くなることはありません(ユーザーが5万人未満になるまで)。

より大きなプロジェクトでは、リソースの支払いは報われ、開発者の賃金よりも安くなります。さらに、RoRでコードを記述することは、他のどのコードよりもはるかに高速であることがわかります。

2014年にあなたが話しているこの速度差の大きさは、ほとんどのWebサイトにとって重要ではありません。


2

WebアプリケーションでRubyのパフォーマンスを処理する方法は、他のプログラミング言語と同じです。

建築

これは、他のほとんどのWebフレームワークよりもRailsで行う方が簡単です。

アプリケーションレベルでは、キャッシュされるはずのものをキャッシュし、インテリジェントな方法でDBへのアクセスを管理します(ボトルネックは通常、ほとんどのWEBアプリの「DB」アクセスにあるため)。

Railsを使用すると、これらの問題を簡単かつ自然に解決できます。データ、ページ、フラグメントをキャッシュするための抽象化がいくつかあり、最適化された再利用可能な方法でSQL部分を処理するための非常に優れた抽象化もあります(Active RecordおよびAREL)。

これが、高速で表現力のない言語(phpなど)で記述された非常に多くのアプリケーションが、Rubyの対応するアプリケーションよりも遅くなる理由です。これらの言語を使用してキャッシングとクエリに取り組むのは、Rubyの場合ほど簡単でエレガントではありません。

インフラストラクチャレベルでは、負荷分散など、私がたまたま知っていないことすべてについて考えるのが妥当です。HerokuEngine Yardなどのプラットフォームをサービスプロバイダーとして採用することで、この問題を外部委託します。とにかく。ロードバランシングを使用したレールのデプロイは、おそらくそれほど難しくありません。


1

Rubyは、簡単に測定できるいくつかのタスク(たとえば、浮動小数点に大きく依存するコードを実行する)において、C ++よりも低速です。これはそれほど驚くべきことではありませんが、資格のない人に「Rubyは遅い」と言うのに十分な正当化です。彼らは、C ++よりもRubyコードを書く方がはるかに簡単で安全であるという事実を考慮していません。

最良の修正は、Rubyコードで別の言語(C、C ++、Fortranなど)で記述されたターゲットモジュールを使用することです。それらは重い作業を行うことができ、スクリプトはより高いレベルの調整の問題に焦点を合わせることができます。


多くの場合、比較はJava、C#、Python、おそらくC ++ではなくPerlで行われます。
rjh

5
もちろん。しかし、私は(Tclの開発者として)人々が常にあなたを他の言語と不当に比較することを保証できます。修正は、一緒にステッチするコンポーネントに他の言語を使用することです。すべてを1つの言語で行うことは、すべてのタスクに単一のツールを使用することに少し似ています。ハンマーさえあれば、すべてが親指のように見えます。
ドナルフェロー

必要なときに外国語モジュールを使用することについての素晴らしいアイデア
スティーブンマードック

>>資格なしの「Ruby is Slow」と言う<<数年前、彼らはTclプログラムよりも遅いRubyプログラムを表示するようになったかもしれません:-)
igouy

1
あなたは彼らが嘘、くそった嘘とベンチマークについて何を言っているか知っています。;-)
ドナルフェロー

0

ほとんどの場合、パフォーマンスとは、優れた設計と最適化されたデータベースの相互作用のことです。Rubyは、ほとんどのWebサイトで必要なこと、特に最近のバージョンを非常に高速に実行します。開発のスピードとメンテナンスの容易さは、コストと顧客の満足度を大幅に向上させます。JAVAは一部のタスクの実行パフォーマンスが遅いことがわかり、JAVAでの開発は困難であるため、ベンチマークで実証されているように、理論上の速度機能に関係なく、多くの開発者が遅いアプリケーションを作成しています(ベンチマークは通常、特定の狭い機能を示すために考案されています)。データベースの機能にあまり適していない集中処理が必要な場合は、プラットフォームに応じて、これらのタスクにCまたはObjective-Cまたはその他の本当に高性能なコンパイル済み言語を選択します。データベース化されたWebアプリケーションを作成する必要がある場合、他の要件に応じて、RoRを使用したり、C#ASP.NETを使用したりしています。すべてのプラットフォームには長所と短所があるためです。アプリケーションが実行する処理の実行速度は重要ですが、結局のところ、言語の1つの狭い側面の実行パフォーマンスだけが重要な場合です。その後、私はまだすべてにアセンブラー言語を使用している可能性があります。



-5

Rubyは開発者の生産性に優れています。Rubyは本来型がないため、テスト駆動開発を強制します。Rubyは、Cライブラリの高レベルのラッパーとして使用するとうまく機能します。Rubyは、JVMまたはRbx VMを介してマシンコードにJITコンパイルされている場合、長時間実行されているプロセスでも良好に機能します。純粋なルビコードで短時間に数値を処理する必要がある場合、Rubyはうまく機能しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.