我刚开始学习Scala,学起来很有趣。今天我也听说了Scala for Android,完全被吸引住了。
然而,考虑到Scala有点像Java的超集,即Java++(我的意思是Java包含更多东西),我想知道Scala代码在Android上如何工作?
此外,如果使用Scala编写Android应用程序,应用程序的性能会受到影响吗?也就是说,如果需要额外的工作来解释Scala代码。
我刚开始学习Scala,学起来很有趣。今天我也听说了Scala for Android,完全被吸引住了。
然而,考虑到Scala有点像Java的超集,即Java++(我的意思是Java包含更多东西),我想知道Scala代码在Android上如何工作?
此外,如果使用Scala编写Android应用程序,应用程序的性能会受到影响吗?也就是说,如果需要额外的工作来解释Scala代码。
稍微解释一下@Aneesh的回答——是的,没有额外的工作来解释Scala字节码,因为它与Java字节码完全相同。
请注意,当您在安卓上运行代码时,还存在一个 Java 字节码 => Dalvik 字节码步骤。
但是使用相同的砖块,一个人可以建造一个自行车棚,而另一个人可以建造一个市政厅。例如,由于该语言鼓励不可变性,Scala 生成了大量的短暂对象。对于成熟的 JVM(如HotSpot)来说,这已经十年没什么问题了。但对于 Dalvik 来说,这是一个问题 (在最近版本之前,对象池和紧密重复使用已创建对象是 Java 中最常见的性能提示之一)。
接下来,写 val 就不同于写 final Foo bar = ...
。在内部,这段代码表示为一个字段 + getter(除非您在 val 前缀中添加 private [this]
,这将转换为通常的 final 字段)。var
被转换为字段 + getter + setter。这为什么很重要?
在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
原始图片 来源为维基百科。
另请参阅Stack Overflow问题在Android上使用Scala值得吗?会有很多开销吗?存在问题吗?,可能会在开发过程中遇到一些问题。
str.indexWhere(...)
这样的调用将在字符串上分配包装器对象。可能会浪费空间。您可以在此博客文章中阅读有关上述建议的更多信息: http://blogs.microsoft.co.il/dorony/2014/10/07/scala-performance-tips-on-android/
Scala编译器将创建JVM字节码。因此,在较低层次上,它就像运行Java一样。因此,性能将与Java相当。
然而,Scala编译器如何创建字节码可能会对性能产生一些影响。我认为,由于Scala是新的,并且由于其字节码生成可能存在的低效,Scala在Android上会比Java慢一些,但差别不大。