1
- import { useCallback , useDebugValue , useRef } from 'react'
1
+ import { useCallback , useDebugValue , useId , useRef , useState } from 'react'
2
2
3
3
import {
4
4
createReduxContextHook ,
@@ -11,6 +11,18 @@ import { notInitialized } from '../utils/useSyncExternalStore'
11
11
12
12
export type CheckFrequency = 'never' | 'once' | 'always'
13
13
14
+ interface Measure {
15
+ duration : number
16
+ startTime : number
17
+ detail : { loc : string ; trace : string ; uid : string ; code : string }
18
+ }
19
+ type Loc = string
20
+ type Uid = string
21
+ const measurements : Record < Loc , Record < Uid , Measure [ ] > > = { }
22
+ // @ts -ignore
23
+ // eslint-disable-next-line no-undef
24
+ globalThis [ Symbol . for ( 'react-redux-selector-measurements' ) ] = measurements
25
+
14
26
export interface UseSelectorOptions < Selected = unknown > {
15
27
equalityFn ?: EqualityFn < Selected >
16
28
stabilityCheck ?: CheckFrequency
@@ -84,10 +96,31 @@ export function createSelectorHook(context = ReactReduxContext): UseSelector {
84
96
85
97
const firstRun = useRef ( true )
86
98
99
+ const [ trace ] = useState < string > ( ( ) => {
100
+ try {
101
+ throw new Error ( )
102
+ } catch ( e ) {
103
+ return e . stack
104
+ }
105
+ } )
106
+ const arr = trace . split ( '\n' )
107
+ const loc = arr [ arr . findIndex ( ( x ) => x . startsWith ( 'useSelector' ) ) + 1 ]
108
+ const uid = useId ( )
109
+
87
110
const wrappedSelector = useCallback < typeof selector > (
88
111
{
89
112
[ selector . name ] ( state : TState ) {
113
+ performance . mark ( 'selectorStart' )
90
114
const selected = selector ( state )
115
+ performance . mark ( 'selectorEnd' )
116
+ // @ts -ignore
117
+ const measure = performance . measure ( 'selector' , {
118
+ start : 'selectorStart' ,
119
+ end : 'selectorEnd' ,
120
+ detail : { trace, loc, uid, code : selector . toString ( ) } ,
121
+ } ) as any as Measure
122
+ ; ( ( measurements [ loc ] ??= { } ) [ uid ] ??= [ ] ) . push ( measure )
123
+
91
124
if ( process . env . NODE_ENV !== 'production' ) {
92
125
const finalStabilityCheck =
93
126
typeof stabilityCheck === 'undefined'
0 commit comments