gpt4 book ai didi

java - Scala for Android 的性能

转载 作者:IT老高 更新时间:2023-10-28 23:27:17 24 4
gpt4 key购买 nike

我刚开始学习Scala ,我正在享受我的生活。今天我也刚刚听说了适用于 Android 的 Scala,我完全被迷住了。

但是,考虑到 Scala 有点像 Java 的超集,因为它是 Java++(我的意思是包含更多内容的 Java),我想知道 Scala 代码在 Android 中究竟是如何工作的?

另外,如果使用 Scala 编写 Android 应用程序的性能会受到影响吗?也就是说,如果需要任何额外的工作来解释 Scala 代码。

最佳答案

解释一下@Aneesh 的答案——是的,解释 Scala 字节码不需要额外的工作,因为它与 Java 字节码完全相同

Enter image description here

注意还有一个 Java 字节码 => Dalvik在 Android 中运行代码时的字节码步骤。

但是使用相同的砖 block ,一个人可以 build 一个自行车棚,另一个人可以 build 一个市政厅。例如,由于语言鼓励不变性,Scala 生成了许多短暂的对象。对于像 HotSpot 这样的成熟 JVM大约十年来这没什么大不了的。但是对于 Dalvik,这是个问题(在最近的版本对象池和 tight reuse of already created objects was one of the most common performance tips 之前,即使是 Java)。

接下来,写 val 不同于写 final Foo bar = ...。在内部,此代码表示为字段 + getter(除非您在 val 前加上 private [this] 前缀,这将被转换为通常的 final 字段)。 var 被翻译成field + getter + setter。为什么它很重要?

Old versions of Android (prior to 2.2) had no JIT完全如此,所以this turns out to about 3x-7x penalty compared to the direct field access .最后,while Google instructs you to avoid inner classes and prefer packages instead , 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 或至少在性能关键点编写较少的惯用代码)以及其中提到的一些问题会在下一版本中由语言本身(最后一个)解决。

原图source was Wikipedia .

另见堆栈溢出问题 Is using Scala on Android worth it? Is there a lot of overhead? Problems? 了解您在开发过程中可能遇到的问题。

关于java - Scala for Android 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com