java - 关于 Android 优化的任何文档 - JAVAC vs JIT vs Dalvik

标签 java android dalvik

我第一次不得不认真考虑如何优化 Android 应用。

我搜索过,但我搜索得越多,我就越困惑。有谁知道描述每个 Java 和 JVM 组件如何优化 WRT JAVAC 字节码和 Dalvik 字节码的好文档?大部分是由 Dalvik 完成的,因此对我来说是“黑盒”吗?值得一看吗?

一些简单的例子。

SharedPreferences settings = getSharedPreferences(MY_PREFERENCES, MODE_PRIVATE);
SharedPreferences.Editor prefEditor = settings.edit();
prefeditor.putString("FOO", "BAR"); 
prefEditor.commit();

对比

getSharedPreferences(MY_PREFERENCES, MODE_PRIVATE).settings.edit().putString("FOO","BAR").commit();

int a, b, c;

a = 2;
b = 3;

c = sum(a,b);

int sum(int x, int y){return x + y;}

对比

c = a + b;

我问的原因是要了解可读性、可维护性和性能之间的权衡。我知道标准答案是“衡量它”,但我正在努力超越这一点,并提前考虑我可以在哪里获得性能,而不是必须返回到复杂的代码并根据指标进行重构。无论如何,我当然会进行测量和剖析,但我的问题是关于理解。

我的思想足够开放,可以接受“甚至不要去那里,写、测量和被诅咒”!

感谢任何见解。

最佳答案

对于 Android 应用程序,您的代码会经过 2 次编译/优化。当您将 java 代码编译为 java 字节码时,第一个由 javac 执行。当您将 java 字节码转换为 dalvik 字节码时,第二个由 dx 执行。

我不熟悉任何描述两者执行的优化的文档。但两者都是开源的(通过 openjdk,用于 javac),因此您可以从理论上检查两者以了解它们进行了哪些优化。

但是,您的示例实际上与编译器级优化无关。我不认为知道 dx 如何优化分配寄存器会帮助您理解如何编写高性能的 Java 代码。

对于您提到的两组示例,我建议在两组示例上尝试 2 种方法。


<强>1。拆卸

第一件事是反汇编 dalvik 字节码,看看有什么不同。简单地计算指令数不一定能告诉您任何信息,但在某些情况下,一个明显比另一个快。

例如,在您的第一组示例中,两个 fragment 的字节码几乎相同,除了第二个 fragment 包含一个额外的指令。因此,第一个代码 fragment 显然性能更高,尽管性能差异非常小。

invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z

对比

invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences$Editor;->putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;
move-result-object v0
invoke-interface {v0}, Landroid/content/SharedPreferences$Editor;->commit()Z

如果您仔细查看这两个 Java 代码段,那么这条额外的指令是有道理的。首先,忽略 putString 的返回值,并在调用 putString 的相同值上调用 commit。在第二个 fragment 中,clone() 是在 putString() 返回的值上调用的,这需要在 dalvik 字节码中进行额外的操作来保存返回值。即,您在那里看到的额外移动结果对象指令。

作为程序员,我们知道 putString 方法的返回值是被调用的同一个对象。但是,编译器无法知道或假设这一点。


<强>2。测量

正如您提到的,您可以做的第二件事是实际分析它们并衡量性能。一段时间后,您应该开始了解可以采取哪些措施来提高绩效。

关于java - 关于 Android 优化的任何文档 - JAVAC vs JIT vs Dalvik,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12758006/

相关文章:

JavaScript 的 Array,Scriptlet 组合不起作用

java - 计算机猜测你的想法所需的猜测次数

android - Android WebView 是否支持 html5?

android - 如何使用 AsyncTask 和 Timer 获取 XML?

android - 使用 gcc 的 C++ 前端编译 C 代码的好处

Android 和链接库

java - 在命令行上选择测试类别

java - Java中的2d ArrayList添加数据

java - 无法使用 Android 从 Google Cloud Storage url 下载图像

android - dexopt 和 dex2oat 的区别?