GitXplorerGitXplorer
R

breqd

public
8 stars
0 forks
1 issues

Commits

List of commits on branch main.
Verified
2116a28bc89b6beb03b6c2f1270b08925668d074

Add why it matters

RRaisinTen committed 4 months ago
Verified
1a30c1dd9f49b08892b8ae62e32b2ed6889b0f66

Fix typo in readme

RRaisinTen committed 4 months ago
Verified
39c8666753bd19214521271fde6e3ce5906f5fb6

Fix test failure

RRaisinTen committed 4 months ago
Verified
3b711158fe48df62a012dec90c8ed76b2addb390

Switch from .npmignore to package.json files

RRaisinTen committed 4 months ago
Verified
f9da00ed7401746dea1178cf4930fdc3552368de

Create node.js.yml

RRaisinTen committed 4 months ago
Verified
fc58635754cf0fe626d868027ba93913eed8cac6

Add API to README.md

RRaisinTen committed 4 months ago

README

The README file for this repository.

breqd

Builtin modules REQuire Durations

This library measures the duration of require() on Node.js' builtin modules.

Usage

CLI usage

$ npx breqd
...
  { moduleName: 'tty', duration: 3822 },
  { moduleName: 'diagnostics_channel', duration: 3410 },
  { moduleName: 'url', duration: 3151 }
]
File generated by breqd: breqd-node-v20.17.0-darwin-x64.json
Open it on https://ui.perfetto.dev!

Opening the generated file on https://ui.perfetto.dev looks like this.

Programmatic usage

import {
  ModuleDurationsMap,
  ModuleDuration,
  getModuleDurations,
  sortModuleDurations,
} from 'breqd';

const moduleDurations: ModuleDurationsMap = getModuleDurations();

const sortedModuleDurations: ModuleDuration[] = sortModuleDurations(moduleDurations);

console.log(sortedModuleDurations);
// [
//   { moduleName: 'repl', duration: 4989944 },
//   { moduleName: 'assert', duration: 3411434 },
//   { moduleName: 'http2', duration: 2925764 },
//   ...
// ]

API

getModuleDurations()

  • Returns ModuleDurationsMap:
    • index (string) - The module name.
    • value (number) - The duration of require() on the module in nanoseconds.

Measures the duration of require() on all builtin modules of the running Node.js process and returns it.

sortModuleDurations()

  • moduleDurations (ModuleDurationsMap) - The module-duration object from getModuleDurations().
  • Returns ModuleDuration[]:
    • moduleName (string) - The module name.
    • duration (number) - The duration of require() on the module in nanoseconds.

Returns a sorted array of all the builtin module require() durations in descending order of durations.

convertModuleDurationstoTEF()

  • moduleDurations (ModuleDuration[]) - The module-duration object from sortModuleDurations().
  • Returns TEF[]:
    • name (string) - The builtin module name.
    • cat (string) - The event category.
    • ph (string) - The event type.
    • pid (number) - The process ID.
    • ts (number) - The tracing clock timestamp of the event.
    • dur (number) - The duration of require() on the module in microseconds.

Converts the sorted array of all the builtin module require() durations into Chrome's Trace Event Format, so that it can be viewed on https://ui.perfetto.dev.

Why does it matter?

It matters if you care about startup performance, like in your Electron app where you might be require()-ing a number of Node.js modules during startup. For example:

The https-proxy-agent module has over 65M weekly downloads and it takes ~75ms to require() v7.0.5 on my Intel macOS Sonoma 14.6.1 running Node.js v20.17.0. ~43ms, i.e., 57% of the total module loading time is spent in requiring just Node.js' own builtin modules! Wouldn't it be great to see this get improved?

The visualization has been generated by using the perftrace project.

License

MIT