我有以下两个用Scala / Monix编写的代码:
def f1(input) =
for {
a <- task1(input)
b <- task2(a)
c <- task3(b)
} yield (c).runSyncUnsafe
和
def f2(input) = {
val a = task1(input).runSyncUnsafe
val b = task2(a).runSyncUnsafe
task3(b).runSyncUnsafe
}
我认为f1版本更好,因为它完全异步并且不会阻塞线程,我的假设是,如果有许多任务正在运行,则第一个应该在多线程中表现更好。
我知道我应该编写一个测试来比较这两种实现,但是这将需要大量重构遗留代码。同样,在我们的特定情况下,对这两个版本进行概要分析也不容易,因此我首先在这里问一下,希望能从具有很多Scala / Monix经验的人那里得到答案:
两者在重载下的性能如何比较?这是一个真正的问题还是非问题?
答案 0 :(得分:0)
一般而言,最好保持尽可能长的异步时间。因此,您可以这样写f1
:
def f1(input) =
for {
a <- task1(input)
b <- task2(a)
c <- task3(b)
} yield c
然后,呼叫者可以决定是调用runSyncUnsafe
还是异步呼叫(runAsync
,runOnComplete
)还是flatMap
来执行其他任务。这样会从您的代码中删除Unsafe
调用,并将其留给调用方来确定是否安全。
就性能而言,将以两种方式对任务进行顺序评估,因为以后的任务取决于先前任务的结果。