gpt4 book ai didi

Android循环字节码对比

转载 作者:搜寻专家 更新时间:2023-11-01 09:08:58 25 4
gpt4 key购买 nike

我一直在 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 编译之类的东西是否为我做了一些优化?

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

非常感谢在这个问题上为启发我所做的任何努力。

最佳答案

我有以下想法。首先,dalvik 字节码不直接在处理器上执行 - 它仍然是字节码,应该转换为 native 代码。

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

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

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

关于Android循环字节码对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com