Future.apply启动异步计算,而Future.successful使用指定的结果创建已完成的Future。那么Future(None)(Future.apply(None))的效率是否低于Future.successful(None)?
Future.apply
Future.successful
Future(None)
Future.apply(None)
Future.successful(None)
nnsrf1az1#
Future.apply(None)创建异步计算并执行它。这意味着创建了额外的lambda对象并调度了额外的任务(无论是多么微不足道的任务)。Future.successful(None)只产生已经完成的future,效率更高。
qni6mghb2#
我不认为Future(None)会产生很大的开销,但在它的默认实现中,每次调用apply都会为ForkJoin线程池生成一个新任务,而Future.successful(None)会立即完成。将来每次调用map或flatMap都会为轮询创建一个新任务,这也会产生一些开销。因此您可能需要查看scalaz Future/Task实现,它更仔细地处理了这些细节。
apply
map
flatMap
scalaz
flvtvl503#
我同意接受的答案,但请检查此链接https://blog.colinbreck.com/future-successful-blocking-your-future-success/Future.successful并不总是更有效,在某些情况下,最好使用Future调用。
Future
3条答案
按热度按时间nnsrf1az1#
Future.apply(None)
创建异步计算并执行它。这意味着创建了额外的lambda对象并调度了额外的任务(无论是多么微不足道的任务)。Future.successful(None)
只产生已经完成的future,效率更高。qni6mghb2#
我不认为
Future(None)
会产生很大的开销,但在它的默认实现中,每次调用apply
都会为ForkJoin线程池生成一个新任务,而Future.successful(None)
会立即完成。将来每次调用map
或flatMap
都会为轮询创建一个新任务,这也会产生一些开销。因此您可能需要查看scalaz
Future/Task实现,它更仔细地处理了这些细节。flvtvl503#
我同意接受的答案,但请检查此链接https://blog.colinbreck.com/future-successful-blocking-your-future-success/
Future.successful
并不总是更有效,在某些情况下,最好使用Future
调用。