Неизменяемая фильтрация. js Список: фильтр против skipUntil против findIndex / takeLast - PullRequest
1 голос
/ 03 мая 2020

Мне нужно отфильтровать Неизменный. 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, я сообщил о проблеме

1 Ответ

0 голосов
/ 11 мая 2020

В неизменяемом режиме самая дорогая / самая медленная операция - это когда нужно создать что-то новое.

findIndex возвращает только один элемент. ему не нужно ничего создавать или изменять.

takeLast внутренне использует слайс, который использует последовательности для создания подсписка вместо заполнения самого нового списка.

filter возвращает Новая коллекция со всеми соответствующими элементами. Создание указанного списка стоит дорого.

skipUntil внутренне вызывает skipWhile(not(predicate), поэтому похоже, что он работает аналогично фильтрации.

Возвращает новую коллекцию того же типа, которая включает записи, начинающиеся с первого предиката, возвращающего true.

Вы могли бы получить более быстрые результаты от skipUntil при создании Seq из списка первым, как это ленивая обертка, и давайте сделаем некоторые операции, не полностью осознавая всю коллекцию.

документы на самом деле довольно хороши, я рекомендую регулярно просматривать их. В Immutable есть некоторые подводные камни, из-за которых вы можете потерять производительность, поэтому я склонен искать функции в do c каждый второй день.

...