『译』Kotlin 协程 vs RxJava 之初探性能测试

更新于 (30/03/2018): RxJava 测试已经改为采用 Schedulers.computation() 调度线程,并且 RxJava 和 协程所有的测试用例均有重新运行。感谢所有留言,是你们让这两者的差异性对比变得更加完善。

我曾好奇在性能方面,如何评估 Kotlin 协程和 RxJava ,由此我决定创建一些简单的测试用例。这篇文章主要是谈论 Android,但是很可能对于其他使用 Kotlin 和 RxJava 的平台也同样适用。

在一个典型的 Android 应用中,我们通常反复执行一些 RxJava 的运算符,因此我就想在运行速度,CPU 及内存的占用方面,对 Kotlin 协程和 RxJava 实现的各种相同运算符作出比较。

这是一个初步的性能测试,在将来,我将尝试更多的深入研究。

有一个主要的问题,大家可能常常会自问:在 Android 开发中,我能够使用 Kotlin 协程代替 RxJava 吗?

简短来说:在大多数情况,你真的应该考虑使用 Kotlin 协程替换 RxJava,尤其在 Android 开发中。RxJava 可能仍然使用在有限的场景之中(除非你在处理真实的流操作,否则通常可能不曾有一个典型的应用场景使用 RxJava)并且即使在这种情况下你也能混合使用 RxJava 和协程。

进一步细化原因:

  • Kotlin 协程更富有灵活性,比起平常的响应式编程(代码可以写的更加易读,无需时时刻刻都使用响应式编程的连续方法,但是当有需要的时候,仍然可以使用Kotlin 运算符集合编写出响应式编程的风格);

  • Kotlin 提供了一个十分强大的运算符集合库,它们看起来和 RxJava 运算符很类似(大多数情况,在 Andorid 开发中,我们处理集合而不是流)

  • Kotlin 协程当需要的时候,能够和 RxJava 混合使用(关于这点的实现,在大多数情况下可以参考一个简单的模式~~注:作者的另一篇博客~~或者参考使用协同实现响应式流指南~~注:官方文档~~ 中的描述)

  • Kotlin 协程是非常轻量级且高效的(随后你将看到这方面的测试用例,RxJava 的内存占用通常高于协程,从而导致应用运行较慢,因为回收 RxJava 创建的所有对象,需要给予更高的 CPU 占用 ;当然这也会转变为更高的电量损耗)

  • 说不定你最终将不再使用 RxJava 因为 Kotlin 协程能实现所有事情,然后你就能移除 RxJava 库的依赖(为你的应用减少一个依赖)~~~译者注:对于这点不好评价,因为其实使用协同通常也要依赖其他库的,只能说这个作者为了布道协程操碎了心,但是通过作者的其他文章可以肯定这个结论应该是他通过实践后的肺腑之言,总之,辩证的看待问题,不轻视他人,也要认清自己当前的场景~~~

测试用例

测试环境:

  • Kotlin 版本:1.2.31

  • Kotlin 协程版本:0.22.5

  • RxJava 版本:2.1.11

  • RxAndroid 版本:2.0.2

  • 测试设备:Samsung Galaxy S6 (Android 7.0, 3 GB RAM)

下面是我打算进行的测试步骤:

  1. 执行一个异步运算符在后台线程中

  2. 执行一个运算符在 Android 主线程,当异步线程完成后

上面的步骤会被重复多次。

这些用例步骤的初衷是,在一个 Android 应用中,我们通常不得不在一个后台线程运行一些运算符(例如:为了远程 API 调用),此外我们需要在 UI 主线程中处理返回结果与 UI 控件的交互。

这些测试用例的源码都能在 GitHub 找到。

测试场景的代码片段

这些代码片段都是使用 Kotlin 协程和 RxJava 实现同样的测试场景。

这里的 stubAsynFunc() 仅仅是执行一个运算符用例并且一直运行于一个后台线程的方法,同时方法 checkTestEnd() 将开始检测,如果所有的测试迭代器都执行完成。

在所有的实现中,stubAsyncFunc() 被平行的运行于多个后台线程。

Kotlin 协程版本:first approach

for (i in 1..TEST_ITERATIONS_COUNT) {
    launch(UI) {
        async(CommonPool) { stubAysncFunc() }.await()
        checkTestEnd(testName)
    }
}

这是第一个使用协程的情景,为每一个测试序列,开启一个新的协程。stubAsyncFunc() 运行于后台线程,然后 checkTestEnd() 运行于主线程,当 stubAsyncFunc() 执行结束后。

原文地址: Kotlin coroutines vs RxJava: an initial performance test

原作者:Andrea Bresolin

你可能感兴趣的:(『译』Kotlin 协程 vs RxJava 之初探性能测试)