Improve performance

This commit is contained in:
Him188 2020-04-27 22:25:53 +08:00
parent c3de96dde0
commit c89e2a7aa6
2 changed files with 17 additions and 5 deletions

View File

@ -51,15 +51,26 @@ fun <E> LockFreeLinkedList<E>.toMutableSet(): MutableSet<E> {
/**
* Builds a [Sequence] containing all the elements in [this] in the same order.
*
* Note that the sequence is dynamic, that is, elements are yielded atomically only when it is required
* Note that the sequence is dynamic
*/
@MiraiInternalAPI
fun <E> LockFreeLinkedList<E>.asSequence(): Sequence<E> {
return sequence {
forEach {
yield(it)
return generateSequence(head) { current: LockFreeLinkedListNode<E> ->
current.nextValidNode(until = tail).takeIf { it != tail }
}.drop(1) // drop head, should be dropped lazily
.map { it.nodeValue }
}
@OptIn(MiraiInternalAPI::class)
internal fun <E> LockFreeLinkedListNode<E>.nextValidNode(until: LockFreeLinkedListNode<E>): LockFreeLinkedListNode<E> {
var node: LockFreeLinkedListNode<E> = this.nextNode
while (node != until) {
if (node.isValidElementNode()) {
return node
}
node = node.nextNode
}
return node
}
@MiraiInternalAPI

View File

@ -20,6 +20,7 @@ import kotlin.test.assertFalse
import kotlin.test.assertTrue
@Suppress("UnusedEquals")
@OptIn(MiraiInternalAPI::class)
@MiraiExperimentalAPI
internal class LockFreeLinkedListTest {
@Test
@ -263,7 +264,7 @@ internal class LockFreeLinkedListTest {
*/
}
@OptIn(ExperimentalCoroutinesApi::class)
@OptIn(ExperimentalCoroutinesApi::class, MiraiInternalAPI::class)
@MiraiExperimentalAPI
internal suspend inline fun <E : LockFreeLinkedList<*>> E.concurrentDo(
numberOfCoroutines: Int,