長い間SOや他の場所ではJavaは遅いという評判があります。 ジョーク から 多くのコメント までの質疑応答では、90年代の経験だけに基づいてJavaは遅いと信じられています。
これが私の問題です。Javaが遅いと人々が信じる理由の 不承認 (ほとんど)があります。小さなことを除けば、Javaはかなり高速です。
では、なぜ今でもJavaが速いと信じるのを拒否しているのでしょうか? C/C++以外のものは遅いという彼らの考え方の一部ですか?人々が時間をかけてチェックしないからですか?人々が偏っているだけなのでしょうか?
それはアプリケーションです。お気づきのように、私たちはhaveを繰り返し証明しましたが、不自然なシナリオではJavaコードは満たすことができますbeat C、C++、LISP、VB6、JavaScriptなどのいわゆる「パフォーマンスの高い」言語です。そのような証拠が提示されると、ほとんどの正気でオープンマインドな対戦相手は恥をかき、そのような中傷を広めることを二度と約束しません。
...しかし、その後、Eclipse、NetBeans、またはGuiffyを起動するか、Javaサポートをブラウザで有効にするか、お気に入りのフィーチャーフォンでアプリを実行してみます。それが反応するように...
...そして待つ...
...そして待つ...
...そして待つ...
...そして待つ...
...そして...
...二度としないと約束したことは?すみません、居眠りしていたに違いありません...
この質問は、誤った前提で動作します。重要な場所Javaはまだ遅いです。重要な場所は、大規模なデータセットでの計算負荷の高いアルゴリズムです。確かに、これらは最適化できます。C/C++コードと同等になることもありますが、モジュール性と汎用性を犠牲にしてのみです。効率的なC++コードは、汎用で汎用ライブラリとして使用できるように設計できます。 Javaコードはできません。高度に最適化されたArray.sort
メソッドは、すべての基本型に異なる実装を使用し、オブジェクトバリアントはC++のジェネリックsort
よりもずっと遅いため、これらのオブジェクトは、等価比較を動的にディスパッチする必要があります。
確かに、HotSpotエンジンによって実行されるジャストインタイムの最適化は、これらの仮想呼び出しのターゲットを実際に予測し、インライン化を試みることができます。しかし、これはC++のsort
メソッド内でディスパッチされる直接インライン化された呼び出しよりもstill遅いです。
私の以前の同僚は、テンプレート化されたC++実装と巨大なデータセット(q-gramを動的形状を使用してカウント)の問題の比較ベンチマークを行いましたオブジェクト指向Java実装。Javaコードは、C++コードよりも桁違いに低速でした。
もちろん、これはリンゴとオレンジを比較しています。しかし重要な点は、Java=実装は(ライブラリーに必要なモジュール性の程度を考えると、パフォーマンスに関して)最良の実装であり、C++実装もそうだったということです。
残念ながら、ベンチマークデータは自由に利用できませんが、ランタイムアブストラクションのオーバーヘッドを比較すると、同様の数値が見られます。たとえば、Scott MeyersはCの一般的なqsort
関数のオーバーヘッドについてEffective STLと書いています:
C++のソートは、高速になると、事実上常にCのqsortを困らせます。 […]実行時に、sortはその比較関数をインライン呼び出ししますが、qsortはポインタを介してその比較関数を呼び出します。 […] 100万回の倍数のベクトルでのテストでは、[sort]は最大670%高速に実行されました…
遅いので...一部のアプリケーションでは。デスクトップアプリケーションは最初から応答する必要があり、起動のオーバーヘッドは遅いと見なされます。
一方、サーバーを実行する場合は、多少の加熱(JIT分析とコンパイル)があっても問題ありません。ブルームーンで一度実行するので、ほとんどの場合、完全に遅いとは言えません。
それは、人々が最初に遭遇したとき、それが遅かったからだと思います。それに基づいて、彼らはその印象を形成しました。彼らがそれを使用しない場合、その印象は変化する可能性は低く、その印象のために彼らはそれを使用しません-それは悪循環です。
私は認めなければなりません、私はJavaは遅い、そしてそうです、それは以前のそれへの暴露からのものであったという印象を持っていました。今私は別の言語に移り、極端に限定された暴露を持っていましたJavaそれ以来。結果として、私の意見はそれほど変わっていません。
Javaがどれほど速くなるかとは関係ありません。人々の心の中ではJavaはWordの「遅い」に関連するconst識別子です。またはOracleはそれについてすることができます。
オラクルがJavaプログラミング文化を(まだ)何もせずに破壊していないことを喜んでください rash or stupid 。それを使用するために過度のライセンス費用を請求するようなものです。以前にサンが所有していたソフトウェア特許に基づく人々:: sigh ::
私はここで反論者になるのは嫌いですが、OracleとGoogleがJavaニースの条件で苦闘するか、GoogleがJava 「適切な」オープンソースプラットフォーム、Javaは、シラミのいる遊び場で子供になるための方法です。IE、誰も20フィートのポールで触れたくないでしょう。
注:明確に言うと、私が世代と言うとき、私はコンピューターの用語ではなく人の用語で話しているのです。 IE、その認識を保持している人々が老後で死ぬか、若い世代に置き換えられるまで、その認識は成り立つでしょう。 5年ではなく50年で考えてください。
1つの理由は、人々は他の人が見ているものの代わりに言うことを信頼するです。
私が最初にプログラミングを始めたときに私が言われたことによると、JavaはC++より「遅い」、そしてJavaを使用できる理由は、それが「便利でJavaはパフォーマンスと引き換えに安全性と利便性をもたらすと信じられています。後のC#が発明されたとしても、人々はJavaより高速であると信じています「ネイティブ」だからです。
しかし、人々がそれを感じずに目にする真実は、Eclipse、IDEは、クラスで最も速いIDEであるということです。私はMSとGNU、BorlandのIDEなど、ほぼすべてのメインストリームIDEを使用しました。EclipseはIDEの絶対的な王です。主に高速であるためです。
もう1つの理由は起動時間が長いです。
Javaは、システムトレイにとどまり、メモリを少し消費し、休憩を取るように促すダイアログをポップアップする小さなアプリの開発には適していません。または、テキストファイルを開いて読み取り、閉じるために使用するメモ帳。これは、常に存在するWebサーバーなどの重要なもので使用し、コンピューティングリソースを最適化して使用し、毎時間数百万のリクエストに応答する必要があります。または、IDE何千ものワークスペースファイルを管理するEclipseのようなものです。あなたは知らないJavaアプリは、少なくとも数時間実行されるまで高速ですが、私は信じている。
@bigown「なぜ人々はまだJava遅いのですか?」
彼らは馬鹿だからです。彼らには仕事の経験はありませんが、彼らはディクストラの生きた化身であるか、ライナス・トーヴァルドの再臨であると思います。そのような遅滞したことを言う理由は非常に多いですが、通常は愚かさ、無関心な主観的な狂信、そして感情的な注意喚起が背後にあるようです。
これを分析して、先ほど言ったことの真実を確認してみましょう。
まず、何が、どのような状況で、どのような状況で、どのようなエンジニアリング/科学/ビジネスの目的で遅いのか(言ってみればと言っても)それらの1つではありません。テクノロジーXの場合、Xは遅い "、または単に" X is Y "の場合、Yは何らかの否定的なステートメントであり、上記の質問に答えることなく、ばかげていると見なす必要があります。このような発言は、工学的には意味がありません。政治や少年のチャットルームでは多分、工学ではない。
第二に、これらの見当違いの愚か者のほとんどはJava ZOMGのために遅いと叫びます、彼らのEclipseは起動するのに永遠にかかります(いや、すべてのプラグインで物をロードし、何が起こるかを推測します。)これらの愚か者の誰も、高速で動作するようにEclipseのjvmを調整する方法すら知りません(または、Javaアプリケーションに関しては)。つまり、パフォーマンスの調整についての手がかりがありません。は、Javaだけでなく、ハードウェアでもソフトウェアでも、重要なシステムにとって現実のものです。
3番目に、Java開発の大部分が何のためにあるかを考えてみましょう:バックエンドOLTP何よりもまず、監視システムは2番目に来ます。システムのどちらのタイプもクラスターで実行し、数か月ではなく数週間中断なく実行します。REALJava appsの目的である場合、小さなEclipseまたはおもちゃのアプリのロードに1〜2分かかることは本当に重要ですか?長期間実行するのですか?コンテキスト、人、コンテキスト。
最後に、OLTPのバックボーンはJavaで実行されます。Javaは低速ではないという矛盾による証拠として、小さなおもちゃの実験、ベンチマーク、検証不可能な付随的証拠ではなく、特に重要な条件。「Xは遅いので、うんざりだ」と言う目的で特別に行われます。
エンジニアリングがあり、ファンボイズムがあります。これらのようなカテゴリのステートメントが属していると思いますか?
ですから、このトピックを一度、そして永久に閉じることはできますか?
https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [テーブルまでスクロールダウン、Javaは3.7 C++より-12.6倍遅い、Google社員による調査]
PS:そうでない場合は、少なくとも1つのSnappy Javaアプリを最初に挙げてください。これまでに見たことのないアプリを1つ挙げてください。
何に比べて遅い?通常のRubyからJRuby(JavaベースのRuby))に変更することを考えています。
意見は意見であり、事実は事実です。
Google Code Jamの事実は次のとおりです。これは、プログラマーに短期間に厳しいコンピューティング問題を解決するように間違いなく挑戦します。つまり、使用する言語のパフォーマンスが重要な役割を果たします。
過去のエディション(2009、2010、2011)では、Javaを使用する約15%ではなく、最終ラウンドに到着したプログラマの約75%がC++を使用していました。
TMHO、これはブラウザでVMを起動するのに必要な時間のためです。アプリケーションがゆっくりと起動すると、人々はそれを覚えているだけです。長い起動時間は本当に煩わしいからです。私の同僚の1人は、遅いためFirefoxを使用しないと私に言った(?!?)が、はい、Windowsでは、Firefoxが表示されるまでに非常に長い時間がかかります。このアプリは遅いです、彼はそれの一般的な速度を考えました。
1997年頃、私はHP Vectra VE(200 MHz)とWindows 95を使用しました。ほとんどのアプリケーションはこれで非常に高速で動作しましたが、Java(正しく思い出せばIDE)で書かれたアプリケーションをいくつか試しました。少なくともGUIの部分は非常に遅くなりました。開始するまでに長い時間がかかり、GUI要素(メニューなど)の応答性はあまりよくありませんでした。視覚的なフィードバックに遅延がありました。また、Java GUIアプリケーションはかなり独特の外観を持っている(持っている)ため、この外観(およびJava)をパフォーマンスの低下に関連付ける方法を学びました。
遅いとはどういう意味かによって異なります。
まず第一に、Javaは最近多くの進歩を遂げたため、ほとんどの場合非常に高速です。しかし:
ちなみに、Javaは、場合によっては、Vanilla C/C++よりも高速です。しかし、これらの言語はそれらを微調整するためのツールを提供します。
Javaは生産性を目的としたプログラミング言語です。現在、ほとんどのアプリケーションには十分高速ですが、他のアプリケーションには十分ではありません。
一般に、Javaの速度の遅さは、ほとんどの場合に影響を受けないため、使いすぎの議論です。
単純な正規のJavaコードは、単純な正規のC/C++/Dコードと同等またはそれより高速になる傾向があります。単純な正規のコードは、不必要に多くのメモリ割り当てを実行する傾向があります。あらゆるCPUアーキテクチャに調整され、大量の低レベルの最適化などは行われていません。JavaのHotSpot GCは驚くべきものであり、VM最適化は静的コンパイラよりも優れている傾向があります出来ました。
一方、あなたが本当にパフォーマンスを必要とし、それを得るために何かを手作業で調整することをいとわないなら、C/C++/Dはこれのためのより多くの機会を提供します。 Javaではインラインアセンブラを使用できません。ダーティタイプのパンニングトリックを使用して、浮動小数点数をビットの配列として扱うことはできません。特定のユースケースでは、GCよりも高速なカスタムメモリ管理スキームを使用できません。 Java C/C++/Dと同じように、スタックにほとんど割り当てることができません。Javaで、ほぼ同等のものを取得する唯一の方法はより高次の関数は、インターフェイスとランタイムバインディングを備えています。Dおよび(私が間違っていれば修正すると思います)C++では、関数をテンプレートに渡すことができるため、柔軟性を失うことなく、コンパイル時にバインディングを実行できます。
Javaの「遅さ」のもう1つのポイントは、64ビットランタイムです。
64ビットコンピュータでJavaが非常に遅いと言う人もいます。 結局のところ、64ビットJavaランタイムは、開始前にプログラム全体をコンパイルするサーバーJVMを使用しています。
[〜#〜]ここ[〜#〜] は、64ビットVMの起動が遅くなる理由です。
たとえば、Windowsの場合:
C:\> Java -version
Java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)
価値のないコインを投入するために、Java webappsは通常、起動時間と応答時間が長く、PythonまたはRubyの方が優れていたでしょう。
私はほとんどのプログラミングにEclipseを使用しており、Javaは、ローカルおよび「スタンドアロン」での実行がより高速でないとしても、他のものと同じくらい高速です。
Javaのパフォーマンスは非常に主観的ですが、Javaが遅い理由の認識は、主に他の人が指摘した理由によるものです:ほとんどの人々の何かの認識は色付きです初期の経験とJavaは、フードの下で常に最適化された言語であるとは限りませんでした。同様に、Vanilla Eclipseは必ずしも高速ではありませんIDE Visual StudioのようなIDEと比較すると、応答性の面で動作し、見劣りします。
ただし、起動時にJavaで発生するUIの問題以外では、ほとんどのアプリケーションで十分高速です。検索すると、他の製品と比較する記事 言語 と提示された結果のほとんどは、主要なデータセットを処理しているときにのみ問題となる範囲に分類されます。
バイオインフォマティクスの分野では、十分にサポートされ、すでにインストールベースがあるため、かなり使用されています。Javaの利点の1つは、 Cではできないことです。バイオインフォマティクスに使用される言語(私はR、Python、およびJavaを定期的に使用しています)を見ると、これらの言語はまったく同じではないことがわかります最速で、バイオインフォマティクスのデータセットが数百ギガバイトの情報に遭遇することも珍しくありません。1日の終わりには、人間の時間はさらに貴重であり、速度の違いは顕著ですが、データセットのサイズ彼らはとにかく彼らが夜通し走るのに十分な大きさになる傾向があります。
簡単なUIをJava=で書く方が簡単だった場合、ほとんどの人が言語を十分にプッシュしないので、速度の認識がレーダーから落ちるのと同じです。基礎。