reduxjs / reselect

Selector library for Redux
MIT License
19.03k stars 671 forks source link

Question: does reselect help with performance on higher-order functions? #575

Open lindapaiste opened 2 years ago

lindapaiste commented 2 years ago

I am writing a higher-order function as a helper for writing selectors on a Redux Toolkit slice and I'm wondering if it makes sense to use reselect here or not.

Here is how that might look with and without using createSelector:

const subSelectV1 = <T>(subSelector: (subState: MySliceState) => T) =>
    (state: RootState): T => subSelector(rootState.mySlice);

const subSelectV2 = <T>(subSelector: (subState: MySliceState) => T) =>
    createSelector(
        (state: RootState): MySliceState => state.mySlice,
        subSelector
    );

Pros: In V2 the subSelector function would not get re-evaluated at all if there are changes to other slices but not to state.mySlice.

Cons: There is maybe some overhead associated with the memoization and caching?

subSelector here would be a simple selector that just accesses data from the state and does not transform it. I would then use the resulting selector as an input selector to createSelector in other places.


The goal is simply to save me from having to write state: RootState and state.mySlice everywhere when I am defining a whole bunch of selectors.

I can write:

export const selectSpecificThing = subSelect(state => state.someProperty);

Instead of:

export const selectSpecificThing = (state: RootState) => state.mySlice.someProperty;
markerikson commented 2 years ago

I don't think there's going to be any harm in using Reselect here, if that's what you're asking. But also not sure if there's going to be much benefit either.

lukeapage commented 2 years ago

It’s going to be very slightly slower to use reselect unless you have non trivial selectors eg if the selector

  1. Creates a new instance and non value type each time - then it will only be recreated if myslice changes so a simple reference check on the created item may lead to performance improvement (if you use react redux for instance)
  2. The selector returns a value type and the function is more complex than a loop to 1 and some equality comparisons and a extra function call

In those cases reselect may offer an advantage.