Я все еще пытаюсь обернуть голову вокруг функций приостановки и разницы (если есть) между функцией приостановки ввода-вывода и приостановки ЦП и другими вещами.
Я запускаю сопрограмму в главном потоке и запускаю функцию с интенсивным использованием процессора различными способами, чтобы увидеть, что происходит.
class TestActivity : AppCompatActivity(), CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
launch {
val start = System.currentTimeMillis()
Log.d("test", "start: $start")
fib(24)
val finish = System.currentTimeMillis()
Log.d("test", "finish: $finish")
Log.d("test", "duration: ${finish - start}")
}
}
Я пробовал эти три варианта функции fib
:
private fun fib(x: Int): Int =
if (x <= 1) x else fib(x - 1) + fib(x - 2)
Обычный способ: xml НЕ раздувается сразу, и для запуска функции требуется 0,1 СЕКУНДЫ.
private suspend fun fib(x: Int): Int =
if (x <= 1) x else fib(x - 1) + fib(x - 2)
Обычный путь + suspend
ключевое слово: xml НЕ раздувается сразу, а для запуска функции требуется 1,3 СЕКУНДЫ.
private suspend fun fib(x: Int): Int =
withContext(Dispatchers.Default) { if (x <= 1) x else fib(x - 1) + fib(x - 2) }
Обычный способ + suspend
ключевое слово + обтекание его withContext(Dispatchers.Default)
: xml IS раздувается немедленно, и для запуска функции требуется 25 СЕКУНД.
Может ли кто-нибудь пролить свет на то, почему существует такая разница в продолжительности между этими тремя функциями?