0

我有以下两段用 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 经验的人回答:

两者在重负载下的性能应该如何比较?这是一个真正的问题还是不是问题?

4

1 回答 1

1

作为一般规则,最好尽可能长时间地保持异步。所以你可以这样写f1

def f1(input) =
  for {
    a <- task1(input)
    b <- task2(a)
    c <- task3(b)
  } yield c

然后,调用者可以决定是调用runSyncUnsafe还是异步调用(runAsync, runOnComplete)或者flatMap它与另一个任务。这将从您的代码中删除Unsafe调用,并将其留给调用者来决定是否安全。

就性能而言,任务将按顺序进行评估,因为后面的任务取决于前面任务的结果。

于 2018-10-04T10:01:38.783 回答