我有一个列表,我想用最少的执行次数来执行所有元素的1个繁重的任务。我的解决方案是创建大量的协程,这些协程等同于带有默认调度程序的列表中的元素。
示例:
list.map {
async {
// do heavy task
}
}.awaitAll()假设我有一个包含500个元素的map,并且我的设备最多有4个线程,可以并行运行最多4个繁重的任务。据我所知,将有4个线程并行执行4个任务,当一个线程执行完成时,将有一个任务分配给该线程并启动。另一个解决方案是为4个线程创建4个协程,每个线程依次执行125个任务。每个线程按顺序运行,限制了多个线程分配任务的时间。因此,它比我的解决方案更快。是对的吗?如果没有,最好的解决方案是什么?
发布于 2021-01-08 01:48:52
我使用以下代码。
它包含了我需要转换成另一个对象类的大量元素的列表。
/**
* 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
}https://stackoverflow.com/questions/65616746
复制相似问题