web-dev-qa-db-ja.com

Python Javaより遅いがPHPより速い

多くの言語が特定のタスクでどのように実行されるかを示すさまざまなベンチマークを見てきました。

これらのベンチマークは、PythonがJavaよりも遅く、PHPよりも速いことを常に示しています。なぜそうなのかと思います。

  • Java、Python、およびPHP仮想マシン内で実行
  • 3つの言語はすべて、プログラムを、OSの上で実行するカスタムバイトコードに変換します-したがって、ネイティブで実行しているものはありません
  • JavaとPythonはどちらも「コンパイル」できます(.pyc for Python)ですが、__main__ Pythonのモジュールはコンパイルされていません

PythonとPHPは動的に型付けされ、Java静的に-これが理由ですJavaの方が高速であり、そうであれば、それが速度にどのように影響するかを説明してください。

そして、たとえdynamic-vs-static引数が正しいとしても、PHPがPython-よりも遅いのはなぜかはどちらも動的言語であるためです。

ベンチマーク herehere 、および here を確認できます

18
treecoder

簡単な(そして高速な)アドホックコンパイラを使用して、JVMコードを効率的にJITコンパイルできます。しかし、PHPおよびPythonでは、動的に型付けされる性質のため、同じことが非常に困難になります。JVMは、C++コンパイラが生成するものと非常に類似した、かなり低レベルで単純なネイティブコードに変換されます。しかし、動的言語では、文字通りすべての基本操作とすべてのメソッド呼び出しに対して動的ディスパッチを生成する必要があります。この動的ディスパッチは、この種のすべての言語の主要なボトルネックです。

場合によっては、はるかに複雑なトレースJITコンパイラーを使用して、動的ディスパッチ(およびJavaの仮想呼び出し)を排除することが可能です。このアプローチはまだ初期段階にあり、抽象的な解釈をあまり行わないため、そのようなコンパイラーはeval呼び出し(動的言語では非常に一般的)を妨げる可能性があります。

PythonとPHPの違いは、後者は品質がはるかに低いということです。理論的には高速に実行できる可能性がありますが、実際にはそうなりません。

26
SK-logic

この質問には絶対的すぎるという一般的な問題があります。 「言語Xは言語Yより速い」と言っても意味がありません。コンピュータ言語自体は、単にアルゴリズムを表現する方法であるため、「高速」でも「低速」でもありません。実際の質問は、「なぜこの特定の問題ドメインで、言語Xの実装X1が言語Yの実装Y1よりも速いのですか」のようなものでなければなりません。

特定の言語は他のドメインよりも特定のドメインを実装する方が簡単なので、いくつかの速度の違いは確かに言語自体から外れるでしょう。しかし、実装を高速化するものの多くは言語ではありません。たとえば、CPython、IronPython、PyPyのいずれについて話しているのかを考慮せずに、「PythonはJavaよりも遅い」とは言えません。これは特に、VMを使用する言語に当てはまります。速度はVMの品質に直接影響されるためです。

余談ですが、私はさまざまな理由で、デバイスでJITを使用できない非常に人気のあるJavaScript VMが通常それをサポートしているシステムを使用しています。同様のプロセッサを搭載したPCの場合よりも遅くなります。言語自体に直接関係のないこの1つの変更により、JavaScriptは「C++よりも数倍遅い」から「C++よりも桁違いに遅い」に変わります。気になるタスク。

また、言語は直接比較できない方法でパフォーマンス特性が異なることも考慮してください。ベンチマークが多すぎると、プログラムを言語Aから言語Bに変換するだけであり、言語によって異なる機能が高速であることを考慮に入れません。 (これは、リンク先のベンチマーク比較など、「Foo言語で実装する方法を教えてくれたことに感謝します」のようなメモがあるため、これをあらゆるベンチマーク比較で見ることができます。)

たとえば、これをとるJavaコード:

for(int i=0;i<10;i++) {
    Object o = new Object;
    doSomething(o);
}

これをC++で「書き換え」、実行時間を比較するのは魅力的です。

for(int i=0;i<10;i++) {
    Object *o = new Object;
    doSomething(o);
    delete(o);
}

問題は、有能なC++プログラマーであれば、C++ではこれが何かを行うための最速の方法ではないことがすぐにわかるということです。 C++により適したものに変更することで、簡単にスピードアップできます。

for(int i=0;i<10;i++) {
    Object o;
    doSomething(&o);
}

重要なのは、C++が高速であるということではありませんが、言語を比較するためのベンチマークを書くことは、本当に、本当に難しいことです。それを適切に行うには、両方の言語のエキスパートであり、両方の言語でゼロから書く必要があります。それでも、1つの言語が特定のタスクに優れている領域に簡単に出くわすことができます。たとえば、ハノイの塔のバージョンをC++で記述して、Javaよりも適切なコンパイラーよりも高速に実行できるようにすることができます。これは、コンパイル時に評価されるC++テンプレートを使用して、基本的に不正を行うことで実現できます。 (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

Javaバージョンが数分間実行されている間、プログラムが即座に戻ったので、「C++はJavaよりも速い」と言えるわけではありません。ビルド)要点は、このさまざまな狭いケースではC++が高速であることです。他の狭いケースでは逆になる可能性があります。したがって、「C++は高速」ではなく、「C++がテンプレートを使用してビルド時に式を評価できます。」満足度は低いですが、真です。

言語の速度の違いは、主に実装に関するものです。コンパイルされた言語はインタープリター言語よりも高速になります。ネイティブコードへのコンパイルは、バイトコードへのコンパイルよりも高速になります。これは、言語が静的に型付けされているかどうかなどの質問よりもはるかに効果的です。そしてもちろん、良い実装は悪い実装よりも速くなります。

また、優れたプログラマーは、多くの場合言語の違いをはるかに上回る程度に、悪いプログラマーよりも速いコードを生成することを忘れないでください。

20
Gort the Robot

それはコンパイラーの品質に関係し、Javaのコンパイラーはずっと長く最適化され続けており、すべてのコードはJava用にコンパイルされているため、最適化はより重要です。 pythonがPHPよりも速いことの正確な理由はわかりませんが、GoogleがPythonに影響を与えたためと思われます。

6
Ryathal

Javaが最も速い理由:

静的に型付けされた+ JITコンパイル+ --serverフラグ。実行中のコードを積極的に再コンパイルします。

PythonがPHPより速い理由:

Pythonは動的言語かもしれませんが、それでも強く型付けされています。これは、コード化した構造がランタイムの最適化に対応できることを意味します。

なぜPHPが悪いのか:

それは基本的にサーバー上のjavascriptです(マルチスレッドサポートなし、完全に動的、緩やかに型付けされます)。

本質的に、コンパイラーがコードについて知っているほど、最適化できます。 Javaは、実行前と実行中に完全に最適化できます。 Pythonは実行中に最適化でき、PHPはひどいです。 Facebookは実際に、サーバーに到達する前にPHPをCに変換します。
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/

4
Ajax

ベンチマークは、重い数学プログラミングを支持するためにかなり歪んでいます。

Pythonは、どこで、なぜそれを考えれば 最初に書かれた であるかを考えると、複雑な数学でかなり優れていることは当然のことです。

一方、PHPはWebページを提供するように作成されていますが、他のことを実行できますが、Webページが最も優れており、標準で better よりもJavaこのタスクで。

1
James Anderson