1

我第一次不得不认真考虑如何优化 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;

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

我很开放,可以接受“甚至不要去那里,写,测量和被诅咒”!

感谢您的任何见解。

4

2 回答 2

2

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

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

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

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


1、拆机

第一件事是反汇编 dalvik 字节码,并查看任何差异。简单地计算指令不一定能告诉你任何事情,但在某些情况下,很明显一个比另一个快。

例如,在您的第一组示例中,两个片段的字节码几乎相同,只是第二个片段包含附加指令。因此,第一个代码段显然性能更高,尽管这将是一个非常小的性能差异。

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 的返回值被忽略,commit 调用的值与调用 putString 的值相同。在第二个片段中,对 putString() 返回的值调用 clone(),这需要在 dalvik 字节码中进行额外操作以保存返回值。即,您在那里看到的额外移动结果对象指令。

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


2. 测量

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

于 2012-10-06T18:28:48.470 回答
0

您的程序中是否有任何需要优化的特定瓶颈?如果没有,那就什么都不做。

于 2012-10-06T08:21:44.580 回答