Scala for Android 的性能

2022-09-03 03:28:50

我刚刚开始学习Scala,我正在度过我生命中的时光。今天我也刚刚听说了Scala for Android,我完全被迷住了。

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

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


答案 1

为了解释一下@Aneesh答案 - 是的,解释Scala字节码没有额外的工作,因为它与Java字节码完全相同

Enter image description here

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

但是使用相同的砖块,一个人可以建造一个自行车棚,另一个人可以建造一个市政厅。例如,由于语言鼓励不可变性,Scala生成了许多短生命对象。对于像HotSpot这样的成熟JVM来说,这在大约十年内并不是什么大不了的事情。但对于Dalvik来说,这是一个问题(在最新版本之前,对象池和对已经创建的对象的严格重用是最常见的性能提示之一,即使对于Java也是如此)。

接下来,编写 val 与编写 .在内部,此代码表示为字段 + getter(除非您在 val 之前添加前缀,否则将使用该字段将其转换为通常的最终字段)。 被翻译成 field + getter + setter。为什么它很重要?final Foo bar = ...private [this]var

旧版本的Android(2.2之前)根本没有JIT,因此与直接现场访问相比,这大约是3x-7x的惩罚。最后,虽然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,或者至少在性能关键点编写更少的惯用代码),并且那里提到的一些问题将在下一个版本中由语言本身(最后一个)解决。

原始图片来源是维基百科

另请参阅Stack Overflow问题 在Android上使用Scala是否值得?是否有很多开销?问题?了解在开发过程中可能遇到的问题。


答案 2

我发现这篇论文显示了两种语言的一些基准测试:

http://cse.aalto.fi/en/midcom-serveattachmentguid-1e3619151995344619111e3935b577b50548b758b75/denti_ngmast.pdf

我还没有读过整篇文章,但最终他们似乎会给Java一个观点:

总之,我们认为Scala在未来的移动应用程序开发中不会发挥重要作用,因为保持设备能耗的重要性。Scala语言的优点是其组件扩展的方式,这在移动设备中并不重要,因为应用程序往往根本无法扩展并保持较小。

感谢阿尔托大学的Mattia Denti和Jukka K. Nurminen。


推荐