【问题标题】:Multiple async coroutine to reduce executed time in Kotlin多个异步协程以减少 Kotlin 中的执行时间
【发布时间】: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


【解决方案1】:

我使用以下代码。

这是我需要转换为另一个对象类的许多元素的列表。

/**
     * Method that converts the [FullStopsInfo] list into [Station] list.
     */
    private fun fastConvert(data: MutableList<FullStopsInfo>): Vector<Station> {
        var data1 = data
        val stations = Vector<Station>()

        var offset = 0
        val range = data1.size / Utils.availableCores()// your 4 cores

        val queue = mutableListOf<Deferred<Int>?>()

        val timeProccessing = measureTimeMillis {
            while (data1.isNotEmpty()) {
                val newRange = min(if(range == 0) 1 else range, data1.size)
                val tempTransfers = data1.subList(0, newRange)

                val preferredTask = addToList(tempTransfers, stations)//the transformation goes here
                queue.add(preferredTask)
                preferredTask.start()

                // Move to the next range
                data1 = data1.subList(newRange, data1.size)
                offset += newRange
            }

            runBlocking {
                queue.forEach {
                    it?.await()//wait until all procceses ended
                }
            }
        }

        Log.d(TAG, "End findSearchAllFullDataStation with $timeProccessing")
        return stations
    }

【讨论】:

    猜你喜欢
    • 2018-02-10
    • 2021-12-15
    • 1970-01-01
    • 2019-06-03
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2012-12-31
    相关资源
    最近更新 更多