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 的指令更为效率了

相关推荐
邪修king29 分钟前
Re:Linux 系统篇(三十四):进程间通信开篇Chapter1 —— 匿名管道 pipe 深度拆解与代码实战
android·linux·运维·开发语言
AFinalStone38 分钟前
Android7 SystemUI 源码解析(一)全景概览与架构设计
android·systemui
2501_916008891 小时前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
恋猫de小郭2 小时前
AndroidX 新增 Security State ,支持可编程的系统安全状态查询
android·前端·flutter
AFinalStone2 小时前
Android7 SystemUI 源码解析(六)QuickSettings快捷设置面板
android·systemui
Kapaseker2 小时前
你有搞明白 Volatile 什么意思吗?
android·kotlin
美狐美颜SDK开放平台2 小时前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk
心平气和量大福大3 小时前
android-权限
android·java
2501_916008893 小时前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
智慧物业老杨5 小时前
物业日常巡查的数智化重构:从“打卡式巡检“到“闭环式风控“
android·java·人工智能·系统架构·rxjava