@Aneesh の回答を少し説明すると、はい、Java バイトコードとまったく同じビットとピースであるため、Scala バイトコードを解釈するための余分な作業はありません。
Android でコードを実行する場合、Java バイトコード => Dalvikバイトコード ステップもあることに注意してください。
しかし、同じレンガを使用して、一方が自転車置き場を建設し、もう一方がタウンホールを建設することができます。たとえば、言語は不変性を助長するという事実のために、Scala は多くの短い生きたオブジェクトを生成します。HotSpotのような成熟した JVM の場合、約 10 年間は大したことではありません。しかし、Dalvikの場合、これは問題です(最近のバージョンより前のオブジェクト プーリングと、作成済みのオブジェクトの厳密な再利用は、Java でも最も一般的なパフォーマンスのヒントの 1 つでした)。
次に、 val を書くことは を書くことと同じではありませんfinal Foo bar = ...
。内部的には、このコードはフィールド + ゲッターとして表されます (private [this]
通常の最終フィールドに変換される val のプレフィックスを付けない限り)。var
フィールド+ゲッター+セッターに変換されます。どうしてそれが重要ですか?
古いバージョンの Android (2.2 より前) には JIT がまったくないため、直接フィールド アクセスに比べて約 3 倍から 7 倍のペナルティが発生します。そして最後に、Google は内部クラスを避け、代わりにパッケージを優先するように指示していますが、Scala はそう書かなくても多くの内部クラスを作成します。次のコードを検討してください。
object Foo extends App {
List(1,2,3,4)
.map(x => x * 2)
.filter(x => x % 3 == 0)
.foreach(print)
}
内部クラスはいくつ作成されますか? 何も言わないこともできますが、scalac を実行すると次のように表示されます。
Foo$$anonfun$1.class // Map
Foo$$anonfun$2.class // Filter
Foo$$anonfun$3.class // Foreach
Foo$.class // Companion object class, because you've used `object`
Foo$delayedInit$body.class // Delayed init functionality that is used by App trait
Foo.class // Actual class
そのため、不変性とシンタックス シュガーを多く使って慣用的な Scala コードを書く場合は特に、多少のペナルティが発生します。問題は、展開 (より新しいデバイスをターゲットにしていますか?) と実際のコード パターン (いつでも Java に戻るか、少なくともパフォーマンスの重要な場所で慣用的なコードを少なく書くことができます) に大きく依存し、そこで言及されている問題のいくつかは、次のバージョンでは、言語自体 (最後のもの) によって対処されます。
元の画像ソースは Wikipediaでした。
スタック オーバーフローの質問も参照してください。Android で Scala を使用する価値はありますか? オーバーヘッドは多いですか?問題?開発中に発生する可能性のある問題について。