有多少协程太多?

时间:2019-03-19 09:14:54

标签: kotlin kotlin-coroutines

我需要加快对具有数百万个元素的某些集合的搜索。 搜索谓词需要作为参数传递。

我一直想知道最简单的解决方案(至少到目前为止)是否会仅仅使用协程来完成任务。

我现在面临的问题是我一次可以实际创建多少个协程。 :D附带说明一下,可能会同时运行多个这样的搜索。

每次进行此类搜索时,我都可以制造数百万个协程(每件商品一个)吗?我应该决定每个协程的工作量(例如每个协程1000个项目)吗?我还应该决定协程数量的上限吗?

我对协程及其实际工作方式有一个大概的了解,但是我不知道此功能的性能局限性。

谢谢!

3 个答案:

答案 0 :(得分:6)

协程的内存权重与从协程构建器块到悬挂点的调用轨迹的深度成比例。每个suspend fun调用都会向链表中添加另一个Continuation对象,并且在协程被挂起时将保留该对象。一个Continuation实例的粗略数字是100个字节。

因此,如果呼叫跟踪深度为5,则每项总计500字节。一百万个项目是500 MB。

但是,除非您的搜索代码涉及阻止使线程保持空闲的操作,否则您不会从协程中获得任何好处。您的任务看起来更像是数据并行化的实例,您可以使用java.util.stream API(在评论中由用户marstran指出)非常有效地解决它。

答案 1 :(得分:0)

根据kotlin coroutine starter guide,该示例启动了100K协程。我相信您打算做的正是kotlin coroutine的设计。

答案 2 :(得分:0)

如果您不会对集合进行很多修改,只需将其存储在HashMap中, 否则将其存储在TreeMap中。然后在那搜索项目。我相信在那里实现的搜索方法已经过优化,足以在一瞬间处理一百万个项目。在这种情况下,我不会使用协程。

文档(针对Kotlin):

HashMap:https://developer.android.com/reference/kotlin/java/util/HashMap

TreeMap:https://developer.android.com/reference/kotlin/java/util/TreeMap