Commit 51e98ef6 authored by Him188's avatar Him188

Improve iteration performance

parent 03caca95
...@@ -16,6 +16,10 @@ import kotlin.jvm.JvmMultifileClass ...@@ -16,6 +16,10 @@ import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
/** /**
* 链接的两个消息.
*
* @see Message.plus
*
* Left-biased list * Left-biased list
*/ */
class CombinedMessage( class CombinedMessage(
...@@ -27,11 +31,19 @@ class CombinedMessage( ...@@ -27,11 +31,19 @@ class CombinedMessage(
private suspend fun SequenceScope<Message>.yieldCombinedOrElements(message: Message) { private suspend fun SequenceScope<Message>.yieldCombinedOrElements(message: Message) {
when (message) { when (message) {
is CombinedMessage -> { is CombinedMessage -> {
// fast path, 避免创建新的 iterator, 也不会挂起协程
yieldCombinedOrElements(message.element) yieldCombinedOrElements(message.element)
yieldCombinedOrElements(message.left) yieldCombinedOrElements(message.left)
} }
is MessageChain -> message.forEach { yieldCombinedOrElements(it) } is MessageChain -> {
else -> yield(message) // 更好的性能, 因为协程不会挂起.
// 这可能会导致爆栈 (十万个元素), 但作为消息序列足够了.
message.forEach { yieldCombinedOrElements(it) }
}
else -> {
check(message is SingleMessage) { "unsupported Message type. DO NOT CREATE YOUR OWN Message TYPE!" }
yield(message)
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment