๐Ÿ“ฆ robhogan / forks-vs-threads

๐Ÿ“„ run.js ยท 69 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69const { Worker } = require("jest-worker");
const Walker = require("walker");
const fs = require("fs");

async function crawl() {
  const absolutePaths = [];
  const walker = new Walker(__dirname + "/node_modules");
  walker.on("file", (filePath) => {
    if (filePath.endsWith(".js")) {
      absolutePaths.push(filePath);
    }
  });
  return new Promise((resolve) => {
    walker.on("end", resolve(absolutePaths));
  });
}

async function main() {
  const absolutePaths = await crawl();
  const enableWorkerThreads = process.env.WORKER_THREADS === "1";
  let workerDuration = 0;
  let readFileDuration = 0;
  let parseDuration = 0;
  let transformDuration = 0;
  let errors = 0;
  let transformed = 0;
  const label = enableWorkerThreads ? "thread" : "fork";
  const worker = new Worker(require.resolve("./worker.js"), {
    enableWorkerThreads,
    numWorkers: 2,
  });

  await worker.start();
  const overallStart = performance.now();
  const results = await Promise.all(
    absolutePaths.map((absPath) => worker.transform(absPath)),
  );
  const overall = performance.now() - overallStart;

  for (const result of results) {
    if (result.error) {
      errors++;
      continue;
    }
    transformed++;
    workerDuration += result.extra.workerTime;
    readFileDuration += result.extra.readFileTime;
    parseDuration += result.extra.parseTime;
    transformDuration += result.extra.transformTime;
  }

  fs.appendFileSync(
    "results",
    JSON.stringify({
      label,
      overall,
      readFileDuration,
      parseDuration,
      transformDuration,
      workerDuration,
      transformed,
      errors,
    }) + ",\n",
  );
  await worker.end();
}

main();