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

相关推荐
wuwu_q15 小时前
彻底讲清楚 Kotlin 的 when 表达式
android·开发语言·kotlin
木易 士心16 小时前
Android 开发核心技术深度解析
android·开发语言·python
QING61816 小时前
Jetpack Compose 条件布局与 Layout 内在测量详解
android·kotlin·android jetpack
一念杂记16 小时前
没网太崩溃!手机电脑网络共享,简单几步搞定网络共享,再也不用为没网担忧~
android·windows
我是好小孩17 小时前
【Android】Binder 原理初探:理解 Android 进程通信机制
android·gitee·binder
-指短琴长-18 小时前
ProtoBuf速成【基于C++讲解】
android·java·c++
下位子18 小时前
『OpenGL学习滤镜相机』- Day4: 纹理贴图基础
android·opengl
2501_9159090618 小时前
iOS 发布 App 全流程指南,从签名打包到开心上架(Appuploader)跨平台免 Mac 上传实战
android·macos·ios·小程序·uni-app·cocoa·iphone
Kapaseker18 小时前
在 Compose 中使用 SurfaceView
android·kotlin
你不是我我18 小时前
【Java 开发日记】设计模式了解吗,知道什么是饿汉式和懒汉式吗?
android·java·开发语言