【发布时间】:2021-01-07 16:59:30
【问题描述】:
我有一个列表,我想执行 1 项繁重的任务,所有元素的执行时间最短。 我的解决方案是使用调度程序默认创建一些等于列表中元素的协程。
例子:
list.map {
async {
// do heavy task
}
}.awaitAll()
假设我有一个包含 500 个元素的地图,并且我的设备有最多 4 个线程,可以并行运行最多 4 个繁重的任务。据我了解,4个线程将并行执行4个任务,当一个线程执行完成时,一个任务将分配给该线程并启动。另一种解决方案是为 4 个线程创建 4 个协程,并按顺序为每个线程执行 125 个任务。每个线程按顺序运行,因此它限制了多次将任务分配给线程。因此它比我的解决方案更快。这样对吗? 如果没有,最好的解决方案是什么?
【问题讨论】:
-
在我看来这些几乎是一样的,第一种方法的代码更简洁,只需为每个项目创建函数对象的代价很小。
-
是的,4 个任务未完成后,任务将按顺序运行。但是,您最多可以将 Dispatchers.IO 用于 64 个线程,因此操作系统可能会更好地安排任务以获得最大收益。
-
@AnimeshSahu 是的,我知道。我只是谈论性能,在我的假设中,第二个解决方案似乎更快,因为它只是将任务分配给 4 个线程的 4 倍。同时第一解系统会在线程完成任务时分配任务
标签: android performance kotlin asynchronous kotlin-coroutines