Skip to content

Commit f9c64be

Browse files
robhoganmeta-codesync[bot]
authored andcommitted
File map: Use worker threads rather than child processes, remove watcher.unstable_workerThreads (#1639)
Summary: Pull Request resolved: #1639 Improve startup performance (especially on Windows) by having the file map use threads rather than child processes to distribute large workloads. In telemetry for humans running Metro at Meta on Node 22, for cases where there are enough files to process to create a worker pool: Creating a pool of threads vs child processes is: - 1.7x faster on macOS - 3.8x faster on Linux - **150x** faster on Windows (6.5s -> 43ms) Processing files on threads vs child processes is: - 1.4x faster on macOS - 1.5x faster on Linux - **3.6x** faster on Windows (18s -> 6s) NOTE: There is a separate worker threads configuration for *transform* workers which we've also been experimenting with, I'll come to that separately. Changelog: ``` - **[Performance]** Use worker threads for processing file changes on startup, significantly faster on Windows ``` Reviewed By: vzaidman Differential Revision: D90510232 fbshipit-source-id: ce4bf7503832e96ad5159e4acdc0ce7f050f2f07
1 parent 33ab992 commit f9c64be

7 files changed

Lines changed: 2 additions & 16 deletions

File tree

packages/metro-config/src/defaults/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ const getDefaultValues = (projectRoot: ?string): ConfigT => ({
145145
timeout: 5000,
146146
},
147147
unstable_lazySha1: true,
148-
unstable_workerThreads: false,
149148
unstable_autoSaveCache: {
150149
enabled: true,
151150
debounceMs: 5000,

packages/metro-config/src/types.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ type WatcherConfigT = {
212212
debounceMs?: number,
213213
}>,
214214
unstable_lazySha1: boolean,
215-
unstable_workerThreads: boolean,
216215
watchman: Readonly<{
217216
deferStates: $ReadOnlyArray<string>,
218217
}>,

packages/metro-config/types/types.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,6 @@ type WatcherConfigT = {
203203
}>;
204204
unstable_autoSaveCache: Readonly<{enabled: boolean; debounceMs?: number}>;
205205
unstable_lazySha1: boolean;
206-
unstable_workerThreads: boolean;
207206
watchman: Readonly<{deferStates: ReadonlyArray<string>}>;
208207
};
209208
export type InputConfigT = Partial<

packages/metro-file-map/src/index.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ export type InputOptions = Readonly<{
7575
computeDependencies?: ?boolean,
7676
computeSha1?: ?boolean,
7777
enableSymlinks?: ?boolean,
78-
enableWorkerThreads?: ?boolean,
7978
extensions: $ReadOnlyArray<string>,
8079
forceNodeFilesystemAPI?: ?boolean,
8180
ignorePattern?: ?RegExp,
@@ -339,7 +338,6 @@ export default class FileMap extends EventEmitter {
339338

340339
this._fileProcessor = new FileProcessor({
341340
dependencyExtractor: buildParameters.dependencyExtractor,
342-
enableWorkerThreads: options.enableWorkerThreads ?? false,
343341
maxFilesPerWorker: options.maxFilesPerWorker,
344342
maxWorkers: options.maxWorkers,
345343
perfLogger: this._startupPerfLogger,

packages/metro-file-map/src/lib/FileProcessor.js

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ const MAX_FILES_PER_WORKER = 100;
5858

5959
export class FileProcessor {
6060
#dependencyExtractor: ?string;
61-
#enableWorkerThreads: boolean;
6261
#maxFilesPerWorker: number;
6362
#maxWorkers: number;
6463
#perfLogger: ?PerfLogger;
@@ -69,7 +68,6 @@ export class FileProcessor {
6968
constructor(
7069
opts: Readonly<{
7170
dependencyExtractor: ?string,
72-
enableWorkerThreads: boolean,
7371
maxFilesPerWorker?: ?number,
7472
maxWorkers: number,
7573
pluginWorkers: ?$ReadOnlyArray<FileMapPluginWorker>,
@@ -78,7 +76,6 @@ export class FileProcessor {
7876
}>,
7977
) {
8078
this.#dependencyExtractor = opts.dependencyExtractor;
81-
this.#enableWorkerThreads = opts.enableWorkerThreads;
8279
this.#maxFilesPerWorker = opts.maxFilesPerWorker ?? MAX_FILES_PER_WORKER;
8380
this.#maxWorkers = opts.maxWorkers;
8481
this.#pluginWorkers = opts.pluginWorkers ?? [];
@@ -239,19 +236,15 @@ export class FileProcessor {
239236
};
240237
}
241238
const workerPath = require.resolve('../worker');
242-
debug(
243-
'Creating worker farm of %d worker %s',
244-
numWorkers,
245-
this.#enableWorkerThreads ? 'threads' : 'processes',
246-
);
239+
debug('Creating worker farm of %d worker threads', numWorkers);
247240
this.#perfLogger?.point('initWorkers_start');
248241
const jestWorker = new JestWorker<{
249242
processFile: WorkerMessage => Promise<WorkerMetadata>,
250243
}>(workerPath, {
251244
exposedMethods: ['processFile'],
252245
maxRetries: 3,
253246
numWorkers,
254-
enableWorkerThreads: this.#enableWorkerThreads,
247+
enableWorkerThreads: true,
255248
forkOptions: {
256249
// Don't pass Node arguments down to workers. In particular, avoid
257250
// unnecessarily registering Babel when we're running Metro from

packages/metro-file-map/src/lib/__tests__/FileProcessor-test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ const p: string => string = filePath =>
3434

3535
const defaultOptions = {
3636
dependencyExtractor: null,
37-
enableWorkerThreads: true,
3837
maxWorkers: 5,
3938
perfLogger: null,
4039
pluginWorkers: [] as $ReadOnlyArray<FileMapPluginWorker>,

packages/metro/src/node-haste/DependencyGraph/createFileMap.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ export default function createFileMap(
9999
computeSha1: !config.watcher.unstable_lazySha1,
100100
dependencyExtractor: config.resolver.dependencyExtractor,
101101
enableSymlinks: true,
102-
enableWorkerThreads: config.watcher.unstable_workerThreads,
103102
extensions: Array.from(
104103
new Set([
105104
...config.resolver.sourceExts,

0 commit comments

Comments
 (0)