web-dev-qa-db-ja.com

なぜ人々はRubyが遅いと言うのですか?

RubyのRailsが好きで、すべてのWeb開発プロジェクトに使用しています。数年前、Railsがメモリを独り占めすることと、それがあまりうまくスケールしないことについて多くの話がありましたが、これらの提案はGregg Pollackここ

しかし最近、私はRuby自体が遅いと言っている人を聞いています。

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

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

  • この「遅さ」に対処したい場合、Rubyプログラマーとしての選択肢は何ですか?

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

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

最後に、Ruby 2.0に関するニュースはあまりありません。それから数年先のことを考えていますか。

182
stephenmurdoch

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でRails 3.1 Ruby 1.9.1を待っています。

最後に、多くの開発者がRubyを選択することを覚えておいてください。他の言語に比べてプログラミングが楽しい体験になり、RubyとRailsが熟練したWebを可能にするからです開発者は非常に迅速にアプリケーションを開発します。

181
Jay Godse

まず、whatに関して遅いですか? C? Python?では、いくつかの数字を取得しましょうコンピューター言語ベンチマークゲーム

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

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

  • Rubyは解釈言語であり、インタプリタ言語はコンパイルされた言語よりも遅くなる傾向があります
  • Rubyはgarbage collectionを使用します(ただし、C#はガベージコレクションも使用しますが、Ruby、Python、PHPよりも2桁先んじています_など、上記のよりアルゴリズム的でメモリ割り当ての少ないベンチマークで)
  • Rubyメソッド呼び出しは遅い(ただし、アヒルのタイピングのため、強く型付けされたインタプリタ言語よりも間違いなく速い)
  • Ruby(JRubyを除く) サポートしないtrue multithreading
  • 等.

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

この「遅さ」に対処したい場合、Rubyプログラマーとしての選択肢は何ですか?

スケーラビリティのために書き込み、それにハードウェアを追加します(例:メモリ)

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

さて、REEPassengerと組み合わせることは非常に良い候補です。

120
vladr

Railsの作成者 David Heinemeier Hansson が言うべきことは次のとおりです。

Rails [Ruby]は、大部分のWebアプリケーションに十分対応しています。 1日に何百万もの動的なページビューを行うサイトがありました。ヤフーやアマゾンのフロントページを使用することになった場合、どの言語の既製のフレームワークでも十分に役立つとは考えられません。おそらく自分で転がす必要があります。しかし、確かに、空き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は、言語の速度よりもはるかに重要になり始めるので、最適化に集中します。

60
rjh

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

34
James K Polk

答えは簡単です:人々はRubyが遅いと言うのはis他の言語との比較に基づいて遅いからです。ただし、「遅い」というのは相対的なものです。多くの場合、Rubyおよび他の「遅い」言語は十分に高速です。

15
Bryan Oakley

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

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

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

5
Tamara Wijsman

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などの言語の開発にお金を費やしています...

4
OlliP

明らかに、速度について話すRubyは負けます。ベンチマークテストでは、RubyがPHPほど遅くないことが示唆されています。しかし、その見返りとして、さまざまな言語のすべてのフレームワークの中で最も保守が容易なDRYコードを取得しています。

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

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

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

2
Rápli András

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

アーキテクチャ

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

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

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

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

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

2

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

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

それはすべて選択です。

2
Frank Heikens

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

最善の解決策は、Rubyコードで別の言語(C、C++、Fortranなど)で記述されたターゲットモジュールを使用することです。それらは面倒な作業を行うことができ、スクリプトはより高いレベルの調整の問題に集中できます。

1
Donal Fellows

人々は、Rubyプログラムを他の言語で書かれたプログラムと比較するため、Rubyは遅いと言います。たぶん、あなたが書くプログラムは高速である必要はありません。たぶん、あなたが書くプログラムのRubyは、ボトルネックではなく、物事を遅くしています。

Ruby 2.1とJavascript V8の比較

通常のLuaと比較したRuby 2.1

Ruby 2.1とPython 3の比較

0
igouy

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

0
Richard