Вот как ваши результаты выглядят на графике журнала:
![urlich201 Benchmark: List vs. Sequence](https://i.stack.imgur.com/EaRvl.png)
Вместо ожидаемых двух прямых, мы получаем в значительной степени бессмысленные кривые. Например, кажется, что обработка последовательности из 10 элементов в 200 раз дороже, чем обработка 100 000.
Я улучшил ваш эталонный тест, применив некоторые основы микробенчмаркинга в JVM, такие как учет прогрева и не игнорирование Результат вычисления:
val size = 10
val warmupIterations = 100_000
val measureIterations = 100_000
val collection = List(size) { Weather((-10..10).shuffled().first()) }
val sequence = collection.asSequence()
var controlSum = 0L
fun main() {
val (a, b) = benchmark(warmupIterations)
println("Warmed up: $a $b")
val (listInNanos, sequenceInNanos) = benchmark(measureIterations)
println("Control sum: $controlSum")
println("size $size")
println("list %.0f sequence %.0f".format(listInNanos, sequenceInNanos))
}
private fun benchmark(iterations: Int): Pair<Double, Double> {
val listInNanos = (1..iterations).map {
measureNanoTime {
controlSum += listApi(collection)
}
}.average()
val sequenceInNanos = (1..iterations).map {
measureNanoTime {
controlSum += sequencApi(sequence)
}
}.average()
return Pair(listInNanos, sequenceInNanos)
}
private fun sequencApi(sequence: Sequence<Weather>): Int {
return (sequence
.map { it.temperature }
.filter { it % 2 == 0 }
.firstOrNull { it < 0 }) ?: -1
}
private fun listApi(collection: List<Weather>): Int {
return (collection
.map { it.temperature }
.filter { it % 2 == 0 }
.firstOrNull { it < 0 }) ?: -1
}
Это мои результаты:
![mtopolnik Benchmark: List vs. Sequence](https://i.stack.imgur.com/I1jZw.png)
По сравнению с вашими результатами стоимость обработки 10 предметов теперь в 100 раз меньше с API-интерфейсом Collection и в 1000000 раз меньше с API-интерфейсом Sequence.
Основной вывод: для вашего случая использования Sequence
обработка дешевле, чем Collection
обработка по всем направлениям.