【问题标题】:Turn off ALL optimization by Dalvik VM关闭 Dalvik VM 的所有优化
【发布时间】:2013-12-18 16:14:10
【问题描述】:

所以我正在尝试为 Android 编写一些低级代码,我主要担心的是我想避免 JIT 编译器(或其他任何东西)的所有优化。经过一些研究,最好的方法似乎是:

  1. 手工编写 Java 字节码
  2. 使用“dx”命令将其转换为 dex 文件
  3. 使用“dalvikvm”命令(通过 adb shell)在程序上运行它并指定“-Xverify:none -Xdexopt:none”参数

我的问题是:这实际上会避免所有优化吗? https://groups.google.com/forum/#!topic/android-platform/Y-pzP9z6xLw 之前的讨论让我不确定,我不能通过阅读文档 100% 说服自己。

非常感谢任何一种方式或其他方式的确认。

【问题讨论】:

  • 你这样做的目的是什么?
  • 你试过手动写字节码吗?你的意思是使用你自己的编译器?手动编写字节码几乎是不可能的。
  • @njzk2,我们的想法是确保以非常具体的方式对硬件施加压力,即填充数据/指令缓存,强制如此多的缓存未命中,如此多的分支等等。当然如此任何优化都会引入很多我想避免的未知数
  • @John 你可以使用 ASM,我是。在我自己的 Eclipse 构建器中这样做,当使用 Log.+ 方法时,您将在 logcat 中看到额外的 merhod 名称和行号,请​​参阅 github.com/pskink/AndroidLoggerBuilder

标签: android performance dalvik


【解决方案1】:

dexopt 执行的某些指令重写无法禁用。例如,访问volatile long 字段的处理方式必须与访问long 字段的方式不同,并且通过用不同的指令替换 field-get 指令来处理特化。

dexopt 执行的优化采用指令替换的形式,通常是某种“加速”,允许 VM 做更少的工作。所有此类优化都是提前静态执行的,而不是在运行时动态执行的,因此您将获得一致的行为。启用dexopt 优化不会引入未知数,它只是从一组已知数变为另一组已知数。

最大的变化来源是 Dalvik 的 JIT 编译器,您可以使用 -Xint:fast 禁用它。请参阅this slightly outdated doc,了解有关如何在系统范围内配置此功能的说明。

【讨论】:

  • 谢谢。我想这与我将要得到的一样接近......另外,按照上面@pskink 的建议,使用 Eclipse 的 ASM 插件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
  • 2011-02-05
  • 2014-01-16
相关资源
最近更新 更多