Kotlin学习

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

2018-04-03  本文已影响943人  zonda的地盘

更新于 (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 和协程。

进一步细化原因:

测试用例

测试环境:

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

  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

上一篇 下一篇

猜你喜欢

热点阅读