Androidアプリは解釈されるため、iOSアプリはAndroidアプリよりも高速ですか?


31

Androidアプリはコンパイルされるのではなく解釈されます。これにより、実行時にiOSアプリよりも遅くなりますか?


14
それはだない Androidアプリがあるため良い質問されていない解釈と同じように、正しい答えは実際に指摘します。
アーロンノート14

2
目標は質問をした人を助けることであるため、通常、受け入れられた回答が最良の回答ではないことはそれほど大きな問題ではありません(このメタ投稿を参照)。しかし、これは非常に極端なケースです@ArmonSafaiあなたが正しいと選択した答えは誤った情報でいっぱいであり、編集で救いのポイントを過ぎています。別の回答を選択することを検討してください。
セラリアドボール14

最近IBMを含む一部の大企業がJavaで主要なアプリケーションを作成していることに注意してください。最新のJava VMの標準部分であるJust-In-Time(JIT)コンパイラを考えると、パフォーマンスは他の高レベル言語と実際に匹敵します。Javaは長年「インタープリター言語」だけではありません。
ケシュラム14

JITコンパイラーは、JVMの概念にまったく関係していません。JITコンパイラーを使用しないJVMがあり、市販のものもあります。IBMのJVMのいくつかのバリエーションは、デフォルトでJITを有効にせず、代わりにデフォルトでAOTコンパイルを有効にします。また、小さなノート「最近のJavaの主要なアプリケーション」は、おそらく10年半前にもう少し適切でした(IBMは1997年より前にJavaに追加していました)
Selali Adob​​or 14

質問はやや誤解を招く恐れがあります。「ネイティブ」iOSアプリはObjective-C(またはSwift)で記述され、コンパイルされますが、「標準」AndroidアプリはJavaで記述され、バイトコードにコンパイルされます。@DanHulmeの回答を参照してください。ただし、PhoneGap / Cordovaなどを使用して、HTMLおよびJavaScriptのいずれかのプラットフォーム用のアプリを作成することは可能です。HTMLアプリは通常、同じプラットフォーム上でネイティブアプリよりも実行が遅いと認識されています。そのため、「他の」プラットフォーム用の同様のアプリが遅いように思われる場合、それはおそらく異なるテクノロジーを使用して作成されたためです。
デビッド14

回答:


85

JavaはAndroidでは解釈されません。Androidアプリは、開発者によってバイトコードにコンパイルされます。バイトコードは、プログラムをコンパクトに表現したものです。プログラマーが作成したソースコードよりも小さいですが、CPUで直接実行することはできません。この段階で、デッドコードの削除などのいくつかの最適化を行うことができます。

アプリをデバイスにロードすると、Dalvik JVMは実行される直前にバイトコードをネイティブ実行可能コードにコンパイルします。これはジャストインタイムのコンパイルです。プログラムがコンパイルされるのを待っている間、それは短時間のスローダウンを引き起こしますが、その後、コードはネイティブ実行可能コードにコンパイルされているため、パフォーマンスのオーバーヘッドはありません。

開発者のコ​​ンピューターで事前にコンパイルする代わりに、この方法で実行することにより、パフォーマンス上の利点がいくつかあります。電話の特定のCPU向けにアプリをコンパイルし、そのハードウェア機能を活用し、パフォーマンス特性を使用できます。たとえば、CPUがサポートしている場合、ハードウェア浮動小数点演算を使用できます。さらに、賢いJITコンパイラー(確かにDalvikはそれほど賢いわけではありません)は、プログラムの実行方法をモニターし、プログラムの実際の使用方法に基づいて最適化を実行できます。お使いの環境や携帯電話でどのオプションがオンまたはオフになっているのかがわかると、より良い分岐ヒントを使用してコードを再コンパイルできます。最先端のコンパイラには、使用するこの情報がありません。

Dalvikは、Dalvikキャッシュおよびその他の技術を使用して、JITコンパイルの欠点を軽減します。Android L以降の新しいJVMであるARTは、JITを完全に事前処理コンパイラに置き換えます。これにより、アプリのインストール時にバイトコードがネイティブの実行可能コードにコンパイルされ、アプリの読み込みを遅らせることなくJITの利点のほとんどが得られます。

Androidアプリが完全にJavaで構成されているわけではないことを忘れないでください。開発者はNDKを使用して、アプリのすべてまたは一部をCまたはC ++で記述します。アプリのパフォーマンスが重要な部分、特にゲーム用です。OpenGLやRenderscriptなどの特別な目的のインターフェイスにより、プログラマーは、GPUやSIMDコプロセッサーなどの特別なハードウェアを利用して、ある種の計算を行うことができます。

本当に、あなたの質問に対する簡単な答えはありません。事前コンパイルの代わりにJITを使用すると、一部の処理が高速になり、一部の処理が遅くなります。これは、OSの全体的なパフォーマンスのほんの一部です。


1
素晴らしい説明のために+1。私は実際にこのような答えを待っていました。
MANI

5
PCでの疲れた古い「.NET / JavaとC ++のパフォーマンス」の議論とそれほど違いはありません。リンゴとオレンジです。
アーロンノート14

1
@ArmonSafaiかなりそうです。
ダンハルム14

2
@MTilsted:それ本当のことですが、ほとんどすべてをキャッシュしているので、あなたが話していることはおそらくアプリを初めて実行したときにのみ起こるでしょう。
アーロンノート14

1
ここでの主な問題は、Dalvikが「通常の」JVMであることです。HotSpotのようなスタックベースとは対照的に(ARMプロセッサとHotSpotの性質が[IA32]などを対象としていたため)、レジスタベースであるのと、Zygoteを使用し、odexファイルの概念(つまり、 (多かれ少なかれ)クラスファイルからクラスローダーに直接移動するわけではありません)、Dalvikを通常のJVMとして扱うことは、いくつかの誤解につながるはずです。特に、HotSpot実装の詳細の多くは、JVMに一般的に誤って関連付けられていることが多いため(JITコンパイラのように)。
セラリアドボール14

2

これは大まかな質問なので、ここで大まかな答えを示します。

「Androidアプリは解釈されるため、iOSアプリはAndroidアプリよりも高速ですか?」

まず、iOSアプリはAndroidアプリよりも「高速」ではありません。

第二に、「Androidアプリは解釈されます」という問題に関して。これは、「15年前」のように、コンピューティングについて言うべきことです。上記の議論からわかるように、今日の状況ははるかに複雑です。まったく新しい技術が前面に出てきました。「コンパイルされるのは、解釈されるよりも速い」という概念です。20年前にマシンコードとperlを比較して、関連性がありました。事態は非常に進んでいるため、今日の問題を「iOS V Android」に実際に明確に適用することはできません。

第三に、モバイルプログラミングには、このような考慮事項を完全に圧倒する他の問題があります。ほんの一例ですが、モバイルプログラマーは、画像の大きなスクロールリストの処理、遅延読み込み、および同様の問題に頭を悩ませています。2つのOS、およびさまざまな一般的なライブラリがこれらの重要な問題をどのように処理するかは、他の問題を圧倒します。

第4に、モバイルに関するもう1つの圧倒的な問題は、グラフィックチップセットの問題と、ソフトウェア、OpenGLなどとのさまざまな複雑な関係です。たとえば、Appleはこれらの問題に関連して「金属」を使用するシステムを発表し、Androidはこの分野で独自の「モノ」を発表しています。グラフィックスパイプラインにまつわるこれらの問題は、アプリがどのように「感じる」かという点で非常に重要です。

あなたの質問に対する非常に短い答えは、「コンパイルされたV.インタプリタ」は基本的にあなたが知っている時代遅れの議論ポイントですか?

(また、iPhoneよりも「遅い」注3を特に見つけません。また、これの一部は純粋な人工物です-安価なAndroid携帯電話が存在します。これからのアイデア。)


-3

解釈されたアプリは、常に遅いという意味ではありません。コンパイルされたものに比べて、より強力で動的な場合があります。コンパイルされたアプリのすべてのコードは一度コンパイルされ、出力はライブラリまたは実行可能ファイルの形式で保持されますが、インタープリター言語では、一度はランダムに実行シーケンスを変更できます。だから私は言うことができる、それは開発者と開発者のプログラミングの方法に依存します。

ただし、Java(Androidのプログラミング言語)は解釈されず、JITコンパイルされます。つまり、Androidプログラムは実行直前にコンパイルされ、iOSのObjective Cとほぼ同等のパフォーマンスが得られます。

最近では、AndroidのARTフレームワークがアプリをプリコンパイルするため、iOSアプリと同じ方法で実行されます。言い換えれば、Androidの次のバージョンは、おそらくiOSと同じくらい高速になるでしょう。

更新

プログラミング言語は一般に、コンパイル済みまたは解釈済みの2つのカテゴリのいずれかに分類されます。コンパイルされた言語では、入力したコードは、実行可能ファイルとして保存される前に、マシン固有の命令のセットに削減されます。インタプリタ言語では、コードは入力したものと同じ形式で保存されます。コンパイルされたプログラムは通常、解釈されたプログラムよりも高速に実行されます。これは、解釈されたプログラムを実行時に機械命令に変換する必要があるためです。ただし、インタープリター言語では、コンパイルされた言語では実行できないことを実行できます。たとえば、解釈されたプログラムは、実行時に関数を追加または変更することにより、自身を変更できます。また、小さなセクションをテストするたびにアプリケーションを再コンパイルする必要がないため、通常、解釈環境でアプリケーションを開発する方が簡単です。


1
??あなたは一度ランダムに実行順序を変更することができますそして、どのようにもイム彼らは少しでも、遅いだけであること、その聞きしたいが遅いと言っていない、彼らはより強力かつダイナミックで、」何を意味しています。
アルモンSafai

3
これは完全に真実ではありません。APKファイルをビルドしてテストデバイスに展開する必要があるため、再コンパイルが不要であると言うのは誤解を招きます。GoogleはJavaの使用を決定しませんでした。Androidは、Googleが購入する前からJavaベースでした。APKファイルには、「[プログラマー]が入力したのと同じ形式の」コードは含まれていません。
ダンハルム14

1
Microsoft .NETはILコードにコンパイルされ、Javaがバイトコードにコンパイルされるように解釈されます。
エスベンスコフペダーセン14

12
この回答の多くの情報は、実際には関連性がなく、技術的に正しいものでもありません。正直に言って、この答えは技術的な正確さのために完全に修正されることをお勧めします。
アザ14

2
通常 Javaはインタープリター言語ではありませんが、異常なJVM実装を扱っている場合を除きます。JITコンパイルはインタープリターと同じものではないため、この回答のほとんどは、AndroidがJITを使用しているため、Androidのパフォーマンスのコンテキストではあまり意味がありません。
eldarerathis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.