gpt4 book ai didi

android - Android协程相当于Executor服务是什么

转载 作者:行者123 更新时间:2023-12-02 13:40:56 24 4
gpt4 key购买 nike

我有一个 ExecutorService 代码 fragment ,我正在尝试将其转换为协程以测试性能。然而,无论我如何构建协程代码,ExecutorService 都快得多。我认为协程应该提高性能

功能:

  • 在后台线程中运行
  • 执行 200000 个 Action (counter++)
  • 发布传递给 UI 线程的时间
  • 代码在更新时间 TextView 的 ViewModel 中运行
  • 执行器服务代码在模拟器上大约需要 150 毫秒
  • 我写的任何协程代码都需要更长的时间

相当于以下代码的协程是什么:

fun runCodeExecutorService() {
spinner.value = true
val executorService = Executors.newFixedThreadPool(NUMBER_OF_CORES * 2)
val result = AtomicInteger()

val startTime = System.currentTimeMillis()

val handler: Handler = object : Handler(Looper.getMainLooper()) {
override fun handleMessage(inputMessage: Message) {
time.value = toTime(System.currentTimeMillis() - startTime)
spinner.value = false
Log.d("tag", "counter Executor = " + result.get())
}
}
thread(start = true) {
for (i in 1..NUMBER_OF_THREADS) {
executorService.execute {
result.getAndIncrement()
}
}
executorService.shutdown();
executorService.awaitTermination(2, TimeUnit.MINUTES)
val msg: Message = handler.obtainMessage()
val bundle = Bundle()
bundle.putInt("MSG_KEY", result.get())
msg.data = bundle

handler.sendMessage(msg)
}
}

其中 NUMBER_OF_CORES 是 val NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors()NUMBER_OF_THREADS 是 200000

最佳答案

@George 实际上你的代码是阻塞的,实际的代码可能看起来像这样:

fun runCodeCoroutines() = viewModelScope.launch {
spinner.value = true
val result = AtomicInteger()

val startTime = System.currentTimeMillis()

withContext(Dispatchers.Default) {
result.aLotOfCoroutines()
}

// 3
time.value = toTime(System.currentTimeMillis() - startTime)
spinner.value = false
Log.d("tag", "counter Dispatchers.Default = " + result.get())

}
suspend fun AtomicInteger.aLotOfCoroutines() {

coroutineScope {
repeat(NUMBER_OF_THREADS) {
launch(Dispatchers.Default) { // 1
getAndIncrement()
}
}
} // 2

}

其中 aLotOfCoroutines 是您的代码这大约是我得到的结果。

基准:协程代码 ~ 1.2 秒执行程序代码 ~ 150 毫秒

还有另一个版本的代码,我将线程数分成 200*1000

suspend fun massiveRun(action: suspend () -> Unit) {
coroutineScope { // scope for coroutines
repeat(NUMBER_OF_TASKS) {
launch {
repeat(NUMBER_OF_ACTIONS) { action() }
}
}
}
}

这大约需要 35 - 40 毫秒然而,Executor 服务中的相同故障需要大约 25 - 35 毫秒

哪个更接近但总体上更好

我的结论是,在考虑性能时,Executor Service 的性能仍然优于协程

协程仅在语法上更好,并且当精确性能不重要时(即网络调用等)

关于android - Android协程相当于Executor服务是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63548474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com