Я работал с приложением, использующим реаги и редуксы. Я столкнулся с проблемой производительности и начал копать. После многих поисков и синхронизации я заметил нечто необычное. При отправке действия с использованием хука 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
. Что вызывает все эти дополнительные издержки?