PythonがJavaより遅いが、PHPより速いのはなぜですか[非公開]


17

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

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

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

PythonとPHPは動的に型付けされ、Javaは静的に型付けされます-これがJavaの方が高速である理由です。

また、dynamic-vs-static引数が正しい場合でも、PHPがPythonより遅い理由は説明できません-両方とも動的言語であるためです。

いくつかのベンチマークはこちらこちら、そしてこちらでご覧いただけます


PythonとPHPについて:実装の質の問題にすぎません。
チャールズサルビア

8
@good_computerほとんどのベンチマークは非常に良くできていません。別の最近のもの(リンクしているとは思わない)があり、それをレビューしたほとんどの人が、「最速」であると主張する言語が単に最適化されたコードを持っていると文句を言った。これは通常、最終的に「遅い」とみなされる言語に詳しくない人によって無意識に行われるため、「速い」とわかった言語でより良いコードを書いていることに気づきません。
イズカタ

@good_computerあなたの質問には「常にこれらのベンチマークはPythonがJavaより遅く、PHPより速い」と「PHPはPythonより遅い」というテキストを含んでいるので、あなたは何かを主張しているように思えます。それらの引用を削除し、質問を言語にとらわれないように言い換えると、再び開かれる可能性があります。
Briddums

この質問は本当に偏っています:(1)初心者プログラマーがマスターしていない言語で書かれた非常に素朴で最適化されていないコードで行われた権限のないベンチマークを参照します(それぞれのコメントスレッドで分析)インタプリタ/バイトコード言語(php / pythonは解釈され、javaのバイトコード化されたpythonキャッシュファイルはバイトコードではなく抽象構文ツリー)と3つの言語の状態(pythonとphpの両方のコンパイルされたバージョンがあります-pythonはより成熟し、コンパイルされています)ただし、phpはfacebookを実行します)
-ZJR

回答:


26

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

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

PythonとPHPの違いについては、後者は品質がはるかに低いだけです。理論的にはより高速に実行できますが、実行されることはありません。


1
動的言語に対してJITが「例外的に」難しいのはなぜですか?JavaScriptの世界でv8またはTraceMonkeyを見てください。JITはうまく機能します。
ツリーコーダー

6
@ good_computer、JITのトレースは、通常のアドホックJITよりも著しく複雑であり、静的に型付けされた言語のJITよりもはるかに低速です。適切なトレースJITには、本格的な抽象解釈が含まれ、すべてのeval呼び出しで停止します。
SKロジック

2
「些細な」部分についてそうは思わないオラクルのHotSpotコンパイラチーム内の百かそこらのエンジニアは、おそらくあります:-)
イェルクWミッターク

1
@JörgWMittagは、もちろん、HotSpotはそれほど単純ではなく、少し静的な分析を行い、ランタイムプロファイリング結果を使用しますが、それでも適切なトレースJITよりもはるかに簡単です。そして、HotSpotは複雑すぎて、その実装は、丁寧に言えば、少し冗長になりすぎていると思います。
SKロジック

1
@Frank Shearar、動的言語のアドホックJITは、静的に型付けされたJITと同じくらい簡単です(たとえば、LuaJITを参照)。効率的なJITであるOTOHはまったく別のものです。
SKロジック

21

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

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

余談ですが、私はさまざまな理由で、通常はサポートしている非常に人気のあるJavaScript VMを使用してデバイスでJITを使用できないシステムを使用しています。これは、JavaScriptがはるかに遅く、同様のプロセッサを搭載した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つの言語が得意な分野に簡単に出くわすことができます。たとえば、妥当なコンパイラでJavaよりも高速に実行されるC ++でハノイの塔のバージョンを書くことができます。コンパイル時に評価されるC ++テンプレートを使用して、基本的にチートすることでそれを行うことができます(http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)

ポイントは、「C ++はJavaより速い」とは言えないということではありません。なぜなら、Javaバージョンが数分間実行されている間、プログラムが即座に戻ったからです大文字小文字が異なる場合、C ++の方が高速です。他の狭いケースでは、逆の場合があります。したがって、「C ++は高速」ではなく、「テンプレートを使用してビルド時に式を評価できるインスタンスではC ++が高速」です。満足度は低いが、真実。

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

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


6

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


8
なぜこれがダウン投票されたのですか?これがまさに答えです。パフォーマンスは純粋に研究とエンジニアリングの努力の問題であり、したがって最終的にはお金です。Java実装を作成する企業は、PythonまたはPHP実装を作成する企業よりも豊富です。それで全部です。
ヨルグWミットタグ

1
さらに、CPythonの最適化は、コードを読みにくくし、パフォーマンスをほんの少ししか向上させない場合に受け入れられないと確信しています。
cgt

2
+JörgW Mittag:私は同意しません。一部の言語機能は、パフォーマンスの実装が非常に困難な場合があるため、効率的な実装の作成が非常に困難またはほとんど不可能になります。一方、「アセンブラー」言語の「効率的な」実装を作成するのは簡単です。
user281377

@ammoQ私は、その多くは型システムに、特にあなたが持っている型と許される操作の正確なセマンティクスを正確に知る能力に帰着すると思います。動的言語は、その性質から柔軟性を獲得しますが、型証明を行うことを難しくします(したがって、安全な超高速コードにコンパイルします)。
ドナルドフェローズ

1
@DonalFellowsまさに私の考え。コンパイル時の情報が少ないほど、実行時に多くを把握する必要があります。
user281377

4

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/


実際、サーバー上のjavascriptはNode.JSであり、私が理解していることから(これを実証するつもりはありませんが)、V8エンジンは一般的にPHPよりも優れています(ただし、おそらく1トンではありません)。さらに、あなたは、Pythonが(?どのようにそれは、その後のJavaに比べて実行しない)ネイティブにコンパイルすることができます言及する必要があります
ジミー・ホッファ

私はそこに役立つほど十分にPythonを使用していませんが、V8を実行しているnodejsはネイティブのC拡張機能をサポートしていると言えます(ただし、JS / Cの境界を越えるのは遅いと思われます)、さらにGoogleのJITコンパイラを利用できます。 ..ノードがpythonとphpの両方より速い場合、私は驚かないでしょう。ここにベンチマークがあります(ほとんどが欠陥です)blog.famzah.net/2010/07/01/… コメント作成者がベンチマークの欠陥を指摘するまで、JavaはJSよりも遅く見えることに注意してください。塩。:)
アヤックス

ただし、ノードとphpは両方ともシングルスレッドであり、クラスタープロキシ(haproxyなど)のセットアップが好きでない限り、本格的な本番環境ではそれらのいずれにも触れません。
アヤックス

1

ベンチマークは、かなり数学的なプログラミングを優先して偏っています。

Python が最初に記述された場所と理由を考慮すると、Pythonが複雑な数学にかなり優れていることは驚くことではありません。

一方、PHPはWebページを提供するために作成されたもので、他のこともできますが、WebページはこのタスクでJava より優れているか、同等以上です

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