Skip to content

Commit 8749d4a

Browse files
rubennortefacebook-github-bot
authored andcommitted
[skip ci] Add benchmark for EventTarget (facebook#48886)
Summary: Changelog: [internal] Creates a benchmarks to measure the performance of `EventTarget`. Reviewed By: javache Differential Revision: D67750677
1 parent 2f10348 commit 8749d4a

File tree

3 files changed

+150
-22
lines changed

3 files changed

+150
-22
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict-local
8+
* @format
9+
* @oncall react_native
10+
*/
11+
12+
import '../../../../../../Libraries/Core/InitializeCore.js';
13+
14+
import Event from '../Event';
15+
import EventTarget from '../EventTarget';
16+
import createEventTargetHierarchyWithDepth from './createEventTargetHierarchyWithDepth';
17+
import {unstable_benchmark} from '@react-native/fantom';
18+
19+
let event: Event;
20+
let eventTarget: EventTarget;
21+
22+
unstable_benchmark
23+
.suite('EventTarget')
24+
.add(
25+
'dispatchEvent, no bubbling, no listeners',
26+
() => {
27+
eventTarget.dispatchEvent(event);
28+
},
29+
{
30+
beforeAll: () => {
31+
event = new Event('custom');
32+
eventTarget = new EventTarget();
33+
},
34+
},
35+
)
36+
.add(
37+
'dispatchEvent, no bubbling, single listener',
38+
() => {
39+
eventTarget.dispatchEvent(event);
40+
},
41+
{
42+
beforeAll: () => {
43+
event = new Event('custom');
44+
eventTarget = new EventTarget();
45+
eventTarget.addEventListener('custom', () => {});
46+
},
47+
},
48+
)
49+
.add(
50+
'dispatchEvent, no bubbling, multiple listeners',
51+
() => {
52+
eventTarget.dispatchEvent(event);
53+
},
54+
{
55+
beforeAll: () => {
56+
event = new Event('custom');
57+
eventTarget = new EventTarget();
58+
for (let i = 0; i < 100; i++) {
59+
eventTarget.addEventListener('custom', () => {});
60+
}
61+
},
62+
},
63+
)
64+
.add(
65+
'dispatchEvent, bubbling, no listeners',
66+
() => {
67+
eventTarget.dispatchEvent(event);
68+
},
69+
{
70+
beforeAll: () => {
71+
event = new Event('custom', {bubbles: true});
72+
const targets = createEventTargetHierarchyWithDepth(100);
73+
eventTarget = targets[targets.length - 1];
74+
},
75+
},
76+
)
77+
.add(
78+
'dispatchEvent, bubbling, single listener per target',
79+
() => {
80+
eventTarget.dispatchEvent(event);
81+
},
82+
{
83+
beforeAll: () => {
84+
event = new Event('custom', {bubbles: true});
85+
const targets = createEventTargetHierarchyWithDepth(100);
86+
eventTarget = targets[targets.length - 1];
87+
for (const target of targets) {
88+
target.addEventListener('custom', () => {});
89+
}
90+
},
91+
},
92+
)
93+
.add(
94+
'dispatchEvent, bubbling, multiple listeners per target',
95+
() => {
96+
eventTarget.dispatchEvent(event);
97+
},
98+
{
99+
beforeAll: () => {
100+
event = new Event('custom', {bubbles: true});
101+
const targets = createEventTargetHierarchyWithDepth(100);
102+
eventTarget = targets[targets.length - 1];
103+
for (const target of targets) {
104+
for (let i = 0; i < 100; i++) {
105+
target.addEventListener('custom', () => {});
106+
}
107+
}
108+
},
109+
},
110+
);

packages/react-native/src/private/webapis/dom/events/__tests__/EventTarget-itest.js

+2-22
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,8 @@ import '../../../../../../Libraries/Core/InitializeCore.js';
1414

1515
import Event from '../Event';
1616
import EventTarget from '../EventTarget';
17-
import {
18-
EVENT_TARGET_GET_THE_PARENT_KEY,
19-
dispatchTrustedEvent,
20-
} from '../internals/EventTargetInternals';
17+
import {dispatchTrustedEvent} from '../internals/EventTargetInternals';
18+
import createEventTargetHierarchyWithDepth from './createEventTargetHierarchyWithDepth';
2119

2220
let listenerCallOrder = 0;
2321

@@ -57,24 +55,6 @@ function createListener(
5755
return listener;
5856
}
5957

60-
function createEventTargetHierarchyWithDepth(
61-
depth: number,
62-
): Array<EventTarget> {
63-
const targets = [];
64-
65-
for (let i = 0; i < depth; i++) {
66-
const target = new EventTarget();
67-
const parentTarget = targets[targets.length - 1];
68-
69-
// $FlowExpectedError[prop-missing]
70-
target[EVENT_TARGET_GET_THE_PARENT_KEY] = () => parentTarget;
71-
72-
targets.push(target);
73-
}
74-
75-
return targets;
76-
}
77-
7858
describe('EventTarget', () => {
7959
describe('addEventListener', () => {
8060
it('should throw an error if event or callback are NOT passed', () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow strict-local
8+
* @format
9+
* @oncall react_native
10+
*/
11+
12+
import EventTarget from '../EventTarget';
13+
import {EVENT_TARGET_GET_THE_PARENT_KEY} from '../internals/EventTargetInternals';
14+
15+
/**
16+
* Returns a tree of EventTargets with the given depth (starting from the root).
17+
*/
18+
export default function createEventTargetHierarchyWithDepth(
19+
depth: number,
20+
): Array<EventTarget> {
21+
if (depth < 1) {
22+
throw new Error('Depth must be greater or equal to 1');
23+
}
24+
25+
const targets = [];
26+
27+
for (let i = 0; i < depth; i++) {
28+
const target = new EventTarget();
29+
const parentTarget = targets[targets.length - 1];
30+
31+
// $FlowExpectedError[prop-missing]
32+
target[EVENT_TARGET_GET_THE_PARENT_KEY] = () => parentTarget;
33+
34+
targets.push(target);
35+
}
36+
37+
return targets;
38+
}

0 commit comments

Comments
 (0)