【发布时间】: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