Мне нужно отфильтровать Неизменный. js Список , который уже отсортирован. Чтобы сравнить три разных подхода, я выполнил следующий тест (на основе Бенни ):
import b from 'benny'
import { Range } from 'immutable'
const elementCount = 100000
const list = Range(0, elementCount).toList()
const predicate = (e: number): boolean => e > elementCount / 2
b.suite(
'Filter sorted Immutable.js List',
b.add('via filter', () => {
list.filter(predicate)
}),
b.add('via skipUntil', () => {
list.skipUntil(predicate)
}),
b.add('via findIndex/takeLast', () => {
list.takeLast(list.size - list.findIndex(predicate))
}),
b.cycle(),
b.complete()
)
Это были результаты на моей машине:
via filter:
104 ops/s, ±1.54% | slowest, 77.09% slower
via skipUntil:
104 ops/s, ±1.65% | 77.09% slower
via findIndex/takeLast:
454 ops/s, ±1.17% | fastest
Очевидно, я ожидал, что простой подход filter
будет самым медленным с O (n), но я немного озадачен тем, что findIndex/takeLast
намного быстрее, чем skipUntil
- кто-нибудь может объяснить, пожалуйста?
ОБНОВЛЕНИЕ: Это похоже на регрессию в v4.0.0-r c .12 по сравнению с v3.8.2, я сообщил о проблеме