R8 如何优化我们的代码(2) -- 空值数据流分析

剪枝

kotlin 复制代码
package org.example

fun <T : Any> coalesce(a: T?, b: T?): T? = a ?: b


fun main() {
    println(coalesce("one", "two"))
    println(coalesce(null, "two"))
}

这段代码比较简单, 对 R8 稍微有点了解的人可能会马上反应过来,这个函数因为过于简单,所以大概率是会被 R8 内联的, 内联以后的代码等效于

go 复制代码
println("one" ?: "two")
println(null ?: "two")

但实际上我们 r8 处理过之后的代码是这样:

你会发现做的比较激进,不只是做了内联,甚至还帮我们做了 Pruning 说人话就是剪枝

这个概念大家自行搜索关键词学习即可,这里就不展开了。我粗浅的理解就是 剪枝的过程就是帮我们排除那些不可能达到的分支代码,并将其移除

空值检查

kotlin 自带空值检查 这个大家肯定都比较熟悉了

kotlin 复制代码
fun String.double(): String = this + this

fun coalesce(a: String?, b: String?): String? = a ?: b

fun main(args: Array<String>) {
    println(coalesce(null, "two")?.double())
}

未使用 r8时,有多条 kotlin 的空值检查语句

使用 r8 之后

多余的空值检查被去除

java中的空值检查

虽然 java 不像 kotlin 中自带空值检查,但是r8 一样对其有着优化

可以看下这个 first 函数

java 复制代码
final class Nulls {
    public static void main(String[] args) {
        System.out.println(first(args));
        if (args == null) {
            System.out.println("null!");
        }
    }

    public static String first(String[] values) {
        if (values == null) throw new NullPointerException("values == null");
        return values[0];
    }
}

需要额外改一下 rules

arduino 复制代码
-keep class Nulls {
   public static java.lang.String first(java.lang.String[]);
}

可以看下未使用 r8 时的指令

使用 r8 之后的指令

显然使用r8 指令之后的 first 方法显的更为高效,因为 null 的条件语句被后置了 从字节码指令的角度来看 显然是 r8 的指令更为效率了

相关推荐
laocooon5238578863 分钟前
C#二次开发中简单块的定义与应用
android·数据库·c#
似霰27 分钟前
传统 Hal 开发笔记5 —— 添加硬件访问服务
android·framework·hal
恋猫de小郭31 分钟前
Android 宣布 Runtime 编译速度史诗级提升:在编译时间上优化了 18%
android·前端·flutter
csj501 小时前
安卓基础之《(4)—Activity组件》
android
游戏开发爱好者81 小时前
H5 混合应用加密 Web 资源暴露到 IPA 层防护的完整技术方案
android·前端·ios·小程序·uni-app·iphone·webview
2501_915106322 小时前
最新版本iOS系统设备管理功能全面指南
android·macos·ios·小程序·uni-app·cocoa·iphone
走在路上的菜鸟2 小时前
Android学Dart学习笔记第十四节 库和导库
android·笔记·学习·flutter
姜西西_2 小时前
自动化测试框架pytest之fixture
android·java·pytest
尐葮阿譽2 小时前
Ubuntu 25.10 安装 Waydroid 安卓模拟器
android·ubuntu·安卓模拟器·waydroid
_李小白2 小时前
【Android FrameWork】实战:跟踪Android APP Surface创建流程
android