包详细信息

estimo

mbalabash337.4kMIT3.0.3

Evaluates how long the browser will execute your javascript code

chrome, tracium, puppeteer, devtools

自述文件

Estimo

Estimo is a tool for measuring parse / compile / execution time of javascript.

This tool can emulate CPU throttling, Network conditions, use Chrome Device emulation and more for measuring javascript performance.

Inspired by Size Limit. Thanks @ai and @aslushnikov for support.

Why?

JavaScript is the most expensive part of our frontend.

3.5 seconds to process 170 KB of JS and 0.1 second for 170 KB of JPEG. @Addy Osmani

3.5 seconds to process 170 KB of JS and 0.1 second for 170 KB of JPEG.

Usage

JS API

const path = require('path')
const estimo = require('estimo')

;(async () => {
  const report = await estimo(path.join(__dirname, 'examples', 'example.js'))
  console.log(report)
})()

CLI

estimo -r ./examples/example.js

Output

;[
  {
    name: 'example.js',
    parseHTML: 1.01,
    styleLayout: 34.08,
    paintCompositeRender: 1.4,
    scriptParseCompile: 1.04,
    scriptEvaluation: 8.11,
    javaScript: 9.15,
    garbageCollection: 0,
    other: 8.2,
    total: 53.84
  }
]

Fields Description

  • name - Resource name (file name or web url).

  • parseHTML - Time which was spent for ParseHTML, ParseAuthorStyleSheet events.

  • styleLayout - Time which was spent for ScheduleStyleRecalculation, UpdateLayoutTree, InvalidateLayout, Layout events.

  • paintCompositeRender - Time which was spent for Animation, HitTest, PaintSetup, Paint, PaintImage, RasterTask, ScrollLayer, UpdateLayer, UpdateLayerTree, CompositeLayers events.

  • scriptParseCompile - Time which was spent for v8.compile, v8.compileModule, v8.parseOnBackground events.

  • scriptEvaluation - Time which was spent for EventDispatch, EvaluateScript, v8.evaluateModule, FunctionCall, TimerFire, FireIdleCallback, FireAnimationFrame, RunMicrotasks, V8.Execute events.

  • javaScript - Time which was spent for both event groups (scriptParseCompile and scriptEvaluation).

  • garbageCollection - Time which was spent for MinorGC, MajorGC, BlinkGC.AtomicPhase, ThreadState::performIdleLazySweep, ThreadState::completeSweep, BlinkGCMarking events.

  • other - Time which was spent for MessageLoop::RunTask, TaskQueueManager::ProcessTaskFromWorkQueue, ThreadControllerImpl::DoWork events.

  • total - Total time.

Time

All metrics are in milliseconds.

We measure system-cpu time. The number of seconds that the process has spent on the CPU.

We not including time spent waiting for its turn on the CPU.

Multiple Runs

All results measured in time. It means that results could be unstable depends on available on your device resources.

You can use runs option to run estimo N times and get median value as a result.

JS API

const report = await estimo(['/path/to/examples/example.js'], { runs: 10 })

CLI

estimo -r /path/to/examples/example.js -runs 10

Diff Mode

You can compare metrics of an origin file with others its versions to understand consequences on performance.

We take the first file as a baseline. All rest files will be compared with the baseline.

JS API

const report = await estimo(['lib-1.0.5.js', 'lib-1.1.0.js'], { diff: true })

CLI

estimo -r lib-1.0.5.js lib-1.1.0.js -diff

Output

;[
  {
    name: 'lib-1.0.5.js',
    parseHTML: 1.48,
    styleLayout: 44.61,
    paintCompositeRender: 2.19,
    scriptParseCompile: 1.21,
    scriptEvaluation: 9.63,
    javaScript: 10.84,
    garbageCollection: 0,
    other: 9.95,
    total: 69.06
  },
  {
    name: 'lib-1.1.0.js',
    parseHTML: 2.97,
    styleLayout: 61.02,
    paintCompositeRender: 2.11,
    scriptParseCompile: 2.11,
    scriptEvaluation: 19.28,
    javaScript: 21.39,
    garbageCollection: 0,
    other: 15.49,
    total: 102.98,
    diff: {
      parseHTML: '2.97 (+50.17% 🔺)',
      styleLayout: '61.02 (+26.9% 🔺)',
      paintCompositeRender: '2.11 (-3.8% 🔽)',
      scriptParseCompile: '2.11 (+42.66% 🔺)',
      scriptEvaluation: '19.28 (+50.06% 🔺)',
      javaScript: '21.39 (+49.33% 🔺)',
      garbageCollection: '0 (N/A)',
      other: '15.49 (+35.77% 🔺)',
      total: '102.98 (+32.94% 🔺)'
    }
  }
]

Additional Use Cases

CPU Throttling Rate

The CPU Throttling Rate Emulation allows you to simulate CPU performance.

  • cpuThrottlingRate (default: 1) - Sets the CPU throttling rate. The number represents the slowdown factor (e.g., 2 is a "2x" slowdown).

JS API:

await estimo('/path/to/example.js', { cpuThrottlingRate: 4 })

CLI:

estimo -r ./examples/example.js -cpu 4

Network Emulation

The Network Emulation allows you to simulate a specified network conditions.

JS API:

await estimo('/path/to/example.js', { emulateNetworkConditions: 'Slow 3G' })

CLI:

estimo -r ./examples/example.js -net Slow\ 3G

Chrome Device Emulation

The Chrome Device Emulation allow you to simulate a specified device conditions.

JS API

const report = await estimo('/path/to/example.js', { device: 'Galaxy S5' })

CLI

estimo -r ./examples/examples.js -device Galaxy\ S5

When using CLI, for device names with spaces you should use symbols escaping.

Changing default timeout

You can specify how long estimo should wait for page to load.

  • timeout (default: 20000) - Sets timeout in ms.

JS API:

await estimo('/path/to/example.js', { timeout: 90000 })

CLI:

estimo -r ./examples/example.js -timeout 90000

Multiple Resources

JS API

const report = await estimo([
  '/path/to/libs/example.js',
  '/path/to/another/example/lib.js'
])

CLI

estimo -r /path/to/example.js https://unpkg.com/react@16/umd/react.development.js

Pages

You can use all features not only with js files, but with web pages too.

We will wait for navigation to be finished when the load event is fired.

JS API

const report = await estimo('https://www.google.com/')

CLI

estimo -r https://www.google.com/

Install

npm i estimo

or

yarn add estimo

How?

It uses puppeteer to generate Chrome Timelines. Which can be transformed in human-readable shape by Tracium.

We will use your local Chrome if it suitable for using with Estimo.

Keep in mind there result depends on your device and available resources.

Who Uses Estimo

Contributing

Pull requests, feature ideas and bug reports are very welcome. We highly appreciate any feedback.

更新日志

Change Log

3.0.3

  • tests dir excluded from the module bundle.
  • Upgraded dependencies.

3.0.2

  • Upgraded dependencies.

3.0.1

  • Upgraded project dependencies.

3.0.0

  • Dropped support for node-12 and migrated to esm (min node version is 14)

2.3.6

  • Hotfix for find-chrome-bin while supporting node < 16

2.3.5

  • Upgraded project dependencies.

  • Fixed npm security issue.

2.3.4

  • Removed npm install script. From this version, estimo won't be looking for or downloading Chrome after npm install. It will be happening on the first launch.

2.3.3

  • Fixed npm security issues.

  • Upgraded project dependencies.

2.3.2

  • Fixed npm security issues.

  • Upgraded project dependencies.

2.3.1

  • Now using find-chrome-bin to find chromium binary.

  • Upgraded project dependencies.

2.3.0

Changed:

  • Replaced yargs with commander which lead to removing 15 dependencies and reducing package size on 146kB.

  • Fixed bug with network emulation.

  • Simplified wording in documentation.

2.2.9

Changed:

  • Fixed issue when chrome detection script fails on win10 (thanks to @BePo65)

  • Fixed npm security issues.

2.2.8

Changed:

  • Increased stability on slow CI's.

  • Dropped support for Node.js 10.

  • Fixed npm security issues.

2.2.7

Changed:

  • Migrated on forked version of trace parcer with patches to avoid errors with navigationStart event. Which is increase stability with newest chromium releases (thanks @sitespeed.io).

  • Removed LATEST_STABLE_CHROME_VERSION and fixed chromeDetection script to work with newest chromium releases.

2.2.6

Changed:

  • Upgraded puppeteer-core to v9.1.0 which fixes BrowserFetcher error on Mac M1.

  • Removed temporary error when running on Mac M1.

2.2.5

Changed:

  • Added temporary error until puppeteer will fully support M1 Mac (#6641).

  • Prevented install-script from failure if some error appeared.

2.2.4

Changed:

  • Handle CHROMIUM_EXECUTABLE_PATH env variable as a source of information to Chromium binary.

  • Upgraded project dependencies.

2.2.3

Changed:

  • Now, it'll show an error when couldn't find Chrome executable path.

  • Upgraded project dependencies.

2.2.2

Changed:

  • Fix npm security issue.

2.2.1

Changed:

  • Fix npm security issue.

2.2.0

Added:

It will be useful for you if you want to understand how performance metrics are changed between a few versions of js libraries.

2.1.2

Changed:

  • Updated project dependencies.

2.1.1

Changed:

  • Updated project docs.

2.1.0

Added:

  • runs - option which you can use to run estimo N times and get median value as a result.

Changed:

  • Fixed broken types.

  • Updated dependencies.

  • Removed debug logging.

  • Removed useless tests.

  • Fixed unhandled exceptions.

2.0.4

  • Fix estimo types.

  • Remove process.exit for plugable use cases.

  • Get MIN_CHROME_VERSION from environment or use predefined version.

2.0.3

  • Fix npm security issue.

2.0.2

  • Add temporary fix for Chrome 80 revision.

  • Upgrade puppeteer-core to 2.1.0.

  • Enhance NODE_ENV ESTIMO_DEBUG output.

  • Don't remove temp files in ESTIMO_DEBUG mode.

  • Add Chrome revision info on npm install hook.

  • Style refactoring.

  • Update tests.

2.0.1

  • Use PUPPETEER_EXECUTABLE_PATH to find chrome execute path if variable available.

2.0.0

  • Add page-mode for processing web pages by url.
  • Change processing logic and split it apart for js files and web pages.
  • Add check for inexistent local js files.
  • Add device option for chrome device emulation.
  • Add width, height options for custom viewport emulation.
  • Add userAgent option for custom userAgent emulation.
  • Add IncognitoBrowserContext support for better performance.
  • Change -l argument to -r (CLI API).
  • Change library field in result output to name (JS API).
  • Add debug log via ESTIMO_DEBUG=true.
  • Add TypeScript typings for better DX.
  • Update tests.
  • Update project documentation.

1.1.6

  • Fix path resolving to chrome binary when using npx.

1.1.5

  • Change chrome detection script for not executing if ESTIMO_DISABLE=true.

1.1.4

  • Fix error on windows.
  • Fix Travis CI error (Build terminated after build exited successfully).
  • Update tests.

1.1.3

  • Fix chrome version check.
  • Remove debug code.

1.1.1

  • Fix security issue with npm packages.

1.1.0

  • Change Travis CI config for launching test with and without suitable chrome.
  • Fix FP, FCP, FMP, LHError errors.
  • Fix memory error on CI ('--no-sandbox', '--disable-setuid-sandbox').
  • Add support for env variables from puppeteer.
  • Add script for local chrome detection.
  • Drop puppeteer support and use puppeteer-core instead.
  • Add multiple files processing.
  • Update project documentation.
  • Add usage examples.

1.0.0

  • Drop perf-timeline support and use puppeteer instead.
  • Drop bigrig support and use tracium instead.
  • Change js/cli api.
  • Update project documentation.

0.1.9

  • Fix path resolving to perf-timeline binary.

0.1.8

  • Update project documentation.
  • Code-style refactoring.

0.1.7

  • Replace node-npx to cross-spawn.

0.1.6

  • Run perf-timeline via node-npx.
  • Add Travis CI.

0.1.5

  • Show processing time when using CLI.
  • Add fields description for estimo result.
  • Add documentation for Network/CPU Emulation.

0.1.4

  • Fix file path resolving when using CLI.

0.1.3

  • Initial release.

0.1

  • PoC implementation.