Skip to content

Commit 21e3e2f

Browse files
Xin Chenfacebook-github-bot
authored andcommitted
Add example to compare memoize expensive JS task (facebook#38831)
Summary: Pull Request resolved: facebook#38831 Changelog: [Internal] - Add example to compare memoize expensive JS tasks Reviewed By: NickGerleman Differential Revision: D48048033 fbshipit-source-id: 6d60ea56a19a25ef2f136aba53ae417b441652ad
1 parent cd0ad93 commit 21e3e2f

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
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+
'use strict';
13+
14+
import * as React from 'react';
15+
import {Text} from 'react-native';
16+
import RNTesterButton from '../../../components/RNTesterButton';
17+
18+
const {useState, useMemo} = React;
19+
20+
function NotMemoizeExpensiveTaskExampleBadExample(): React.Node {
21+
const [count, setCount] = useState(0);
22+
23+
let expensiveResult = 0;
24+
for (let i = 0; i < 50000000; i++) {
25+
expensiveResult += i;
26+
}
27+
28+
return (
29+
<>
30+
<Text>{`Expensive Result: ${expensiveResult}`}</Text>
31+
<RNTesterButton onPress={() => setCount(count + 1)}>
32+
{`Click me to count: ${count}`}
33+
</RNTesterButton>
34+
</>
35+
);
36+
}
37+
38+
function NotMemoizeExpensiveTaskExampleGoodExample(): React.Node {
39+
const [count, setCount] = useState(0);
40+
41+
const expensiveResult = useMemo(() => {
42+
let sum = 0;
43+
for (let i = 0; i < 50000000; i++) {
44+
sum += i;
45+
}
46+
return sum;
47+
}, []);
48+
49+
return (
50+
<>
51+
<Text>{`Expensive Result: ${expensiveResult}`}</Text>
52+
<RNTesterButton onPress={() => setCount(count + 1)}>
53+
{`Click me to count: ${count}`}
54+
</RNTesterButton>
55+
</>
56+
);
57+
}
58+
59+
export default {
60+
title:
61+
'Expensive tasks should be memoized to avoid unnecessary long JS tasks',
62+
description:
63+
'Each re-render will run expensive job to get a result. The result should be memoized to avoid unnecessary re-computation',
64+
Bad: NotMemoizeExpensiveTaskExampleBadExample,
65+
Good: NotMemoizeExpensiveTaskExampleGoodExample,
66+
};

packages/rn-tester/js/examples/Performance/performanceComparisonExamples/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ export {default as ReRenderWithNonPureChildExample} from './ReRenderWithNonPureC
1313
export {default as ReRenderWithObjectPropExample} from './ReRenderWithObjectPropExample';
1414
export {default as SetStateInWrongEffectExample} from './SetStateInWrongEffectExample';
1515
export {default as RenderOffscreenContentExample} from './RenderOffscreenContentExample';
16+
export {default as NotMemoizeExpensiveTaskExample} from './NotMemoizeExpensiveTaskExample';

0 commit comments

Comments
 (0)