Dalvik 和 Android 工具链可以带来哪些优化?

2024-01-29

我正在开发一个高性能 Android 应用程序(一款游戏),虽然我首先尝试编写代码以提高可读性,但我喜欢在脑海中保留一幅幕后发生的事情的图片。通过 C++,我对编译器能为我做什么和不能做什么有了相当好的直觉。我正在尝试为 Java/Android 做同样的事情。

于是就有了这个问题。我在网上找不到关于这个主题的信息。 Java 编译器、Dalvik 转换器 (dx) 和/或 JITter(在 Android 2.2+ 上)是否会执行如下优化?

  • 方法内联。在什么条件下?private方法始终可以安全地内联;这会完成吗?怎么样public final方法?其他类的对象上的方法?static方法?如果编译器可以轻松推断出对象的运行时类型怎么办?我应该将方法声明为final or static尽可能?

  • 公共子表达式消除。例如,如果我访问someObject.someField两次,查找只进行一次吗?如果这是对 getter 的调用怎么办?如果我使用某个算术表达式两次怎么办?只会评估一次吗?如果我使用某个表达式的结果(我知道其值不会改变)作为 a 的上限会怎样?for loop?

  • 对数组查找进行边界检查。工具链是否会在某些情况下消除这种情况,例如典型的情况for loop?

  • 值内联。将访问一些public static final int总是内联?即使他们在另一个班级?即使它们在另一个包裹中?

  • 分支预测。这究竟是一个多大的问题呢?在典型的 Android 设备上,分支是否会对性能造成很大影响?

  • 简单的算术。将要someInt * 2被替换为someInt << 1?

诸如此类...


我是 Ben,JIT @ Google 的工程师之一。当 Bill 和我开始这个项目时,目标是尽快交付一个有效的 JIT,同时对资源争用(例如内存占用、CPU 被编译器线程劫持)影响最小,以便它可以在低端设备上运行出色地。因此我们使用了一个非常原始的基于跟踪的模型。也就是说,传递给 JIT 编译器的编译实体是一个基本块,有时短至一条指令。此类跟踪将在运行时通过称为链接的技术缝合在一起,以便解释器和代码缓存查找不会经常被调用。在某种程度上,加速的主要来源来自于消除频繁执行的代码路径上重复的解释器解析开销。

也就是说,我们确实使用 Froyo JIT 实现了相当多的本地优化:

  • 寄存器分配(由于 JIT 生成 Thumb 代码,v5te 目标有 8 个寄存器/v7 有 16 个寄存器)
  • 调度(例如,Dalvik 寄存器的冗余 ld/st 消除、负载提升、存储下沉)
  • 冗余空检查消除(如果可以在基本块中找到这种冗余)。
  • 简单计数循环的循环形成和优化(即循环体中没有侧出口)。对于此类循环,基于扩展归纳变量的数组访问被优化,以便仅在循环序言中执行空和范围检查。
  • 每个虚拟调用点有一个条目内联缓存,并在运行时进行动态修补。
  • 窥视孔优化,例如 mul/div 字面操作数的功耗降低。

在 Gingerbread 中,我们为 getter/setter 添加了简单的内联。由于底层 JIT 前端仍然是基于简单的跟踪,因此如果被调用者在其中有分支,则不会内联。但是内联缓存机制的实现使得虚拟 getter/setter 可以毫无问题地内联。

我们目前正在努力扩大编译范围,超越简单的跟踪,以便编译器有更大的窗口进行代码分析和优化。敬请关注。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dalvik 和 Android 工具链可以带来哪些优化? 的相关文章

  • 在 AppAuth-Android 中注销

    我有一个用JAVA开发的Android应用程序 对于这个应用程序 我使用的是身份服务器4 https github com IdentityServer IdentityServer4作为我的 STS 一切正常 但我找不到任何注销的实现Ap
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 更改Android菜单的背景颜色[重复]

    这个问题在这里已经有答案了 我正在尝试将标准浅灰色更改为浅绿色 似乎没有一个简单的方法可以做到这一点 例如 通过 Android 主题 但我找到了一个解决方法 如本页所述 http tinyurl com 342dgn3 http tiny
  • 如何在Android中解析xml类型的HTTPResponse

    我有一个 Android 应用程序 我使用 POST 方法来获取响应 这是我的代码 HttpResponse httpResponse httpclient execute httppost HttpEntity resEntity htt
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox
  • 在状态栏下方显示DialogFragment内容

    我试图显示高度和宽度均具有 match parent 的 DialogFragment 但碰巧在顶部 DialogFragment 显示在 StatusBar 下方 DialogFragment 正在应用一些默认值来填充底部 右侧 左侧和顶
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • putFragment() - 片段 x 当前不在 FragmentManager 中

    上面的标题被问了很多次 但答案似乎与FragmentStatePagerAdapter这与我的问题无关 我正在使用该方法putFragment Bundle String Fragment 直接地 The 安卓文档 http develop
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了

随机推荐

  • 我可以在 C# 中找到 BigInteger 的位数吗?

    我正在解决这个问题 https projecteuler net problem 25 其中他们要求第一个 1000 位斐波那契数的索引 我的第一个想法类似于 BigInteger x 1 BigInteger y 1 BigInteger
  • jquery中的TextBox前景色

    为什么这段代码不起作用 TextOne animate color FFFF00 800 当我点击按钮调用它时 它什么也不做 我有 Chrome 您是否正在使用颜色插件 http plugins jquery com files jquer
  • 使用 tSQL 计算多个表中的行数

    我需要计算 SQL Server 2008 中多个表中的行数 我这样做 select count from select from tbl1 union all select from tbl2 但它给了我一个语法错误近 的错误 为什么 附
  • Android 中的意图过滤器是什么?

    在我的 Android 应用程序中 我想从初始活动 A 开始活动 B 我为这两个项目创建了课程 但是 当使用以下代码启动 B 时 我收到运行时错误 application has stopped unexpectedly try again
  • 集合迭代器中的不完整类型

    我自己编写了一个自定义的 STL 样式容器 它在内部使用 AVL 树来组织数据 现在 在一个项目中 我希望有一个迭代器作为成员 class vertex avl tree
  • 如何在 JavaFX 8 警报中指定按钮的特定顺序

    我需要要求用户确认执行某项操作 确认对话框的按钮组是 是 否 和 取消 我的代码如下 private ButtonType askYesNoCancel String question Alert alert new Alert Alert
  • Linq Join With Include 语句

    IQueryable
  • 软键盘推送布局

    我一直在尝试许多解决方案来防止软键盘出现时推动我的布局 然而 所有的解决方案都不起作用 简而言之 我希望布局中的所有内容 按钮 imageViews 背景 textViews textEdits 在显示软键盘时保持在原位 我不关心它会涵盖什
  • 为什么 Flutter Web 中的按钮没有边距?

    我有以下代码 Scaffold appBar AppBar title Text Test body Center child Column mainAxisAlignment MainAxisAlignment center childr
  • 使用嵌套数组合并两个字典

    我有 2 本词典 a I 1 2 II 1 2 III 1 2 b I 3 4 II 3 4 IV 3 4 我怎样才能合并它们以获得以下结果 c merge dicts a b 其中 c 是 I 1 2 3 4 II 1 2 3 4 III
  • 抽象和概括有什么区别?

    我理解抽象就是把更具体的东西变得更抽象 该东西可能是数据结构或过程 例如 数据抽象 矩形是正方形的抽象 它集中于正方形有两对相对边的事实 而忽略了正方形的相邻边相等的事实 程序抽象 高阶函数map是一个过程的抽象 该过程对值列表执行某些操作
  • 在 Glass GDK 沉浸式应用程序中打开活动时如何使屏幕变亮?

    我有一个 GDK 沉浸式应用程序 其中启动器Activity获得一个SCREEN DIM WAKE LOCK WakeLock 该应用程序还有一个服务 它将接收聊天消息并启动Intent for an Activity显示每一个 每当消息A
  • HTML5 输入类型=日期:我可以使用 JavaScript 打开/关闭日期选择器吗?

    我正在尝试自定义 HTML5 输入 type date 元素 我想添加一个单独的按钮 单击该按钮将切换日期选择器下拉列表的可见性 我找不到任何这方面的信息 非常感谢任何帮助 这是我使用 CSS 制作的解决方案 webkit box sizi
  • 如何检查某个字是否被 PHP 保留?

    有没有一些函数可以检查一个单词是否是reserved http www php net manual en reserved keywords php在 PHP 中还是我可以自己使用它 我可以手动检查它 只需使用它并查看错误或警告 但我需要
  • 从 XSD 生成 Go 结构

    最近打算用Go做一个项目 我的问题是 给定一个 XSD 文件 如何在 Go 中自动生成结构来表示 XML 元素 它类似于使用 xjc 从 XSD 生成 java 类 那么Go中有没有任何工具或包可以做到这一点呢 提前致谢 看起来它可能需要一
  • 从外部连接到 docker 容器中的 Postgresql

    我在 Docker 容器的服务器上有 Postgresql 如何从外部 即我的本地计算机 连接到它 我应该应用什么设置来允许这样做 您可以通过这种方式运行 Postgres 映射端口 docker run name some postgre
  • 将 java 系统属性传递给 ant 测试

    我让 ant 使用以下代码执行 jar
  • 轮播引导程序中的拉伸图像

    我正在使用 Bootstrap 4 那里有一个带有图片的轮播 图像一直显示拉伸 不知道出了什么问题 carousel margin bottom 4rem position relative carousel caption bottom
  • 在非常大的树上执行 DFS 的最佳方法是什么?

    情况是这样的 应用世界由数十万个状态组成 给定一个状态 我可以计算出一组 3 或 4 个其他可到达的状态 一个简单的递归可以构建一个状态树 它会变得非常大且非常快 我需要从根状态到该树中的特定深度执行 DFS 以搜索包含 最小 状态的子树
  • Dalvik 和 Android 工具链可以带来哪些优化?

    我正在开发一个高性能 Android 应用程序 一款游戏 虽然我首先尝试编写代码以提高可读性 但我喜欢在脑海中保留一幅幕后发生的事情的图片 通过 C 我对编译器能为我做什么和不能做什么有了相当好的直觉 我正在尝试为 Java Android