【问题标题】:Android loop bytecode comparisonAndroid循环字节码比较
【发布时间】:2012-04-04 21:41:10
【问题描述】:

我一直在 Android 中使用循环进行一些实验,但对结果感到困惑。

过去我在某处读到过(在 C++ 中??)如果你翻译这个循环:

for(int i = 0; i != Integer.MAX_VALUE; i++)
{
   // Do something
}

...进入这个循环:

for(int i = threshold; --i >= 0; )
{
    // Do the same
}

您可以显着提高性能,因为第二个变体会生成与零的比较,由于处理器架构,这比第一个循环中两个非零值之间的比较快得多。

我想看看这在 Android 中是否成立,所以我开始编写代码并使用 DEX 查看生成的 Dalvik 的字节码,以检查是否存在任何类型的编译器优化。

确实是这些结果:

0003dc: 1201                                   |000e: const/4 v1, #int 0 // #0  
0003de: 1402 ffff ff7f                         |000f: const v2, #float NaN // #7fffffff 
0003e4: 3321 5000                              |0012: if-ne v1, v2, 0062 // +0050 

000434: 1401 ffff ff7f                         |003a: const v1, #float NaN // #7fffffff
00043a: d801 01ff                              |003d: add-int/lit8 v1, v1, #int -1 // #ff 
00043e: 3b01 2800                              |003f: if-gez v1, 0067 // +0028 

(这与 0062 和 0067 的代码无关,因为我只关心它本身的循环)。

好吧,但是我们可以清楚地看到编译器/翻译器没有引入优化,因为两种循环语法都有不同的生成字节码。

既然已经设置了上下文,并且我证明了继续测试是有用的,那么是时候提出问题了:

“我分析了上面的代码并发现无论循环的执行顺序如何,第一个总是比第二个花费更多的时间,我在这里缺少什么?”

像 JIT 编译这样的东西是否在为我做一些优化?

我希望两个循环的行为不同,因为生成的字节码不一样。

非常感谢您在这个问题上为我提供的任何努力。

【问题讨论】:

    标签: android optimization loops bytecode dalvik


    【解决方案1】:

    在第一个程序集中,if-ne 指令比较两个值(v1 和 v2)并根据结果跳转。这比 if-gez 指令在第二种情况下仅将一个值与零进行比较要慢。但也许我误解了你的问题,你的意思是两个循环在相同的执行时间内运行吗?从你的问题中不清楚。你得到什么时间?

    【讨论】:

    • 谢谢,维尔!正如我在 Yury 的评论中所说,时间与循环的执行顺序无关。现在不管你把哪个放在第一位,它总是会运行得更慢......
    【解决方案2】:

    我有以下想法。首先,dalvik 字节码不是直接在处理器上执行的——它仍然是字节码,它应该被转换成原生代码。

    其次,让我们考虑一下为什么 C++(x86 平台)中的第二种情况会比第一种更快:

    1. 所以在第一种情况下,您将有一个类似的代码:inc (i),然后 比较两个值处理器将从 其次,检查结果是否等于 0(使用 jz 指令或类似的东西)。
    2. 在第二种情况下,处理器将 dec (i) 然后结果值将与 0 进行比较(使用 jz)。

    因此,您可以看到第二种情况对于一条指令来说更短。我猜同样的事情发生在 ARM 处理器中,这就是为什么第二个循环比第一个更快。

    【讨论】:

    • 非常感谢,尤里!问题是:第二个循环并不比第一个快。如果您切换执行顺序(即运行我在第一个循环之前提出的第二个循环),后者总是会更快。尽管您认为 DEX 在运行之前被转换为本机代码的想法可能会解释这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 2018-11-30
    • 2019-03-25
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多