Вы столкнулись с печально известной проблемой " цветная функция ".Эти два мира действительно разделены, и, хотя вы можете добавить поверхностный слой, объединяющий их, вы не сможете получить его с нулевой производительностью.Это настолько фундаментально, что, даже если предположить, что ваш suspend
блок на самом деле никогда не приостанавливается, а слой переноса использует это предположение и даже не использует runBlocking
, вы все же заплатите цену«быть готовым приостановить».Однако цена невелика: это означает создание небольшого объекта на каждый вызов suspend fun
, который содержит данные, которые обычно находятся в собственном стеке вызовов потока.В вашем случае только внешний блок является приостановленным, так что это всего лишь один из таких объектов.
runBlocking
запускает сопрограмму в потоке, в котором вы ее вызвали, и она будет синхронно завершаться в том же потоке, пока не приостановит себя.Поэтому ваш случай, когда у вас будет некоторый синхронный код в блоке suspend
, не будет страдать от дополнительного снижения производительности из-за координации потоков.
Если сопрограмма приостановит себя, тогда должен быть какой-то внешнийрабочий поток, который будет реагировать на событие, позволяющее возобновить сопрограмму, и должна быть некоторая координация между этим потоком и вашим исходным потоком runBlocking
.Это фундаментальный механизм, который существует с сопрограммами или без них.