Диспетчеризация избыточного действия имеет длительное время выполнения - PullRequest
1 голос
/ 04 февраля 2020

Я работал с приложением, использующим реаги и редуксы. Я столкнулся с проблемой производительности и начал копать. После многих поисков и синхронизации я заметил нечто необычное. При отправке действия с использованием хука useDispatch отправка занимает намного больше времени, чем я бы предположил, чтобы вернуться.

Вот как я измерил время выполнения:

const partialDar = {
    coordinates,
    displayName: appUser.displayName,
    formattedAddress: property.place.formattedAddress,
    isCardinal: Boolean(property.cardinal),
    propertyId: property.propertyId,
    senderId: appUser.userId,
    serviceProviderId: appUser.serviceProviderId
};

const startTime = Date.now();
dispatch(startDar(partialDar))
const endTime = Date.now();
console.log(`${endTimer-startTimer}ms`);
import { createSlice } from "@reduxjs/toolkit";
import uuidv4 from "uuid/v4";

import * as constants from "../../../constants";

const patrolModeSlice = createSlice({
  name: "patrolMode",
  initialState: {
    enabled: false,
    options: {
      darsNote: "",
      cooldown: constants.patrols.defaultCooldown,
      includeCardinals: false
    },
    darsInProgress: {
      byPropertyId: {}
    },
    inBoundPropertiesOnCooldown: {
      byId: {}
    }
  },
  reducers: {
    enable: (state, action) => {
      const { darsNote, cooldown, includeCardinals } = action.payload;
      state.enabled = true;
      state.options = {
        darsNote: darsNote ? darsNote : constants.patrols.defaultMessage,
        cooldown,
        includeCardinals
      };
    },
    disable: (state, action) => {
      state.enabled = false;
      state.darsInProgress.byPropertyId = {};
    },
    startDar: (state, action) => {
      const startTime = Date.now();
      const {
        coordinates,
        displayName,
        formattedAddress,
        isCardinal,
        propertyId,
        senderId,
        serviceProviderId
      } = action.payload;
      if (state.enabled && !state.darsInProgress.byPropertyId[propertyId]) {
        state.darsInProgress.byPropertyId[propertyId] = {
          displayName,
          formattedAddress,
          isCardinal,
          notes: state.darsNote
            ? state.darsNote
            : constants.patrols.defaultMessage,
          patrolId: uuidv4(),
          propertyId,
          senderId,
          serviceProviderId,
          startCoordinates: coordinates,
          startTime: Date.now()
        };
      }
      const endTime = Date.now();
      console.log(`reducer ${endTimer-startTimer}ms`);
    },
    endDar: (state, action) => {
      const { propertyId } = action.payload;
      if (state.enabled) {
        delete state.darsInProgress.byPropertyId[propertyId];
      }
    }
  }
});

const { actions, reducer } = patrolModeSlice;

export const { disable, enable, endDar, startDar } = actions;

export default reducer;

export const selectEnabled = state => state.patrolMode.enabled;
export const selectOptions = state => state.patrolMode.options;
export const selectDarsInProgress = state => state.patrolMode.darsInProgress;

Я бы ожидал, что таймер, окружающий диспетчер, покажет 0ms или 1ms в качестве выходного сигнала, но после измерения множества различных диспетчерских действий измеренное время будет широко варьироваться между 25ms и 1000ms.

Кроме того, таймер внутри фактического редуктора работал под 1ms. Что вызывает все эти дополнительные издержки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...