Skip to content

Commit

Permalink
Refactor performance memory API implementation
Browse files Browse the repository at this point in the history
Summary:
This diff refactors performance memory API and the RN Tester example.

- The returned value from C++ is number, so no need to cast
- Reuse `MemoryInfo` in RNTester example

Changelog:
[General][Internal] - Code refactor for performance memory API implementation

Reviewed By: rubennorte

Differential Revision: D43523878

fbshipit-source-id: 37d1f6a829a8eac45f7e3791ad36be0c199c6041
  • Loading branch information
Xin Chen authored and facebook-github-bot committed Mar 8, 2023
1 parent 96659f8 commit f4e56fd
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 25 deletions.
9 changes: 9 additions & 0 deletions Libraries/WebPerformance/MemoryInfo.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,23 @@ export default class MemoryInfo {
}
}

/**
* The maximum size of the heap, in bytes, that is available to the context
*/
get jsHeapSizeLimit(): ?number {
return this._jsHeapSizeLimit;
}

/**
* The total allocated heap size, in bytes
*/
get totalJSHeapSize(): ?number {
return this._totalJSHeapSize;
}

/**
* The currently active segment of JS heap, in bytes.
*/
get usedJSHeapSize(): ?number {
return this._usedJSHeapSize;
}
Expand Down
11 changes: 6 additions & 5 deletions Libraries/WebPerformance/Performance.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,14 +110,15 @@ export default class Performance {
const memoryInfo = NativePerformance.getSimpleMemoryInfo();
if (memoryInfo.hasOwnProperty('hermes_heapSize')) {
// We got memory information from Hermes
const {hermes_heapSize, hermes_allocatedBytes} = memoryInfo;
const totalJSHeapSize = Number(hermes_heapSize);
const usedJSHeapSize = Number(hermes_allocatedBytes);
const {
hermes_heapSize: totalJSHeapSize,
hermes_allocatedBytes: usedJSHeapSize,
} = memoryInfo;

return new MemoryInfo({
jsHeapSizeLimit: null, // We don't know the heap size limit from Hermes.
totalJSHeapSize: isNaN(totalJSHeapSize) ? null : totalJSHeapSize,
usedJSHeapSize: isNaN(usedJSHeapSize) ? null : usedJSHeapSize,
totalJSHeapSize,
usedJSHeapSize,
});
} else {
// JSC and V8 has no native implementations for memory information in JSI::Instrumentation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*/

'use strict';
import type MemoryInfo from '../../../../../Libraries/WebPerformance/MemoryInfo';
import type ReactNativeStartupTiming from '../../../../../Libraries/WebPerformance/ReactNativeStartupTiming';

import * as React from 'react';
Expand All @@ -22,11 +23,7 @@ const performance = new Performance();

function MemoryExample(): React.Node {
// Memory API testing
const [memoryInfo, setMemoryInfo] = useState<{
jsHeapSizeLimit?: ?number,
totalJSHeapSize?: ?number,
usedJSHeapSize?: ?number,
}>({});
const [memoryInfo, setMemoryInfo] = useState<?MemoryInfo>(null);
const onGetMemoryInfo = useCallback(() => {
// performance.memory is not included in bom.js yet.
// Once we release the change in flow this can be removed.
Expand All @@ -40,25 +37,13 @@ function MemoryExample(): React.Node {
<Button onPress={onGetMemoryInfo} title="Click to update memory info" />
<View>
<Text>
{`jsHeapSizeLimit: ${
memoryInfo.jsHeapSizeLimit == null
? 'N/A'
: memoryInfo.jsHeapSizeLimit
} bytes`}
{`jsHeapSizeLimit: ${String(memoryInfo?.jsHeapSizeLimit)} bytes`}
</Text>
<Text>
{`totalJSHeapSize: ${
memoryInfo.totalJSHeapSize == null
? 'N/A'
: memoryInfo.totalJSHeapSize
} bytes`}
{`totalJSHeapSize: ${String(memoryInfo?.totalJSHeapSize)} bytes`}
</Text>
<Text>
{`usedJSHeapSize: ${
memoryInfo.usedJSHeapSize == null
? 'N/A'
: memoryInfo.usedJSHeapSize
} bytes`}
{`usedJSHeapSize: ${String(memoryInfo?.usedJSHeapSize)} bytes`}
</Text>
</View>
</View>
Expand Down

0 comments on commit f4e56fd

Please sign in to comment.