marky

High-resolution JavaScript timer based on performance.mark/measure (461 bytes min+gz)

  • Owner: nolanlawson/marky
  • Platform:
  • License:: Apache License 2.0
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

marky Build Status

JavaScript timer based on performance.mark() and performance.measure(), providing high-resolution
timings
as well as nice Dev Tools visualizations.

For browsers that don't support performance.mark(), it falls back to
performance.now() or Date.now(). In Node, it uses process.hrtime().

Quick start

Install via npm:

npm install marky

Or as a script tag:

<script src="https://unpkg.com/marky/dist/marky.min.js"></script>

Then take some measurements:

var marky = require('marky');

marky.mark('expensive operation');
doExpensiveOperation();
marky.stop('expensive operation');

Why?

The User Timing API is more performant
than console.time() and console.timeEnd(),
and more accurate than Date.now(). Also, you get nice visualizations in Chrome Dev Tools:

Chrome Dev Tools screenshot

As well as Edge F12 Tools:

Edge F12 screenshot

This is because marky adds standard
PerformanceEntries to the Performance Timeline. Tools like WebPageTest and Windows Performance Analyzer also surface them, and you can even send them to your analytics provider.

API

marky.mark() begins recording, and marky.stop() finishes recording:

marky.mark('releaseTheHounds');
releaseTheHounds();
marky.stop('releaseTheHounds');

You can also do more complex scenarios:

function setSail() {
  marky.mark('setSail');
  marky.mark('raiseTheAnchor');
  raiseTheAnchor();
  marky.stop('raiseTheAnchor');
  marky.mark('unfurlTheSails');
  unfurlTheSails();
  marky.stop('unfurlTheSails');
  marky.stop('setSail');
}

marky.stop() also returns a PerformanceEntry:

marky.mark('manTheTorpedos');
manTheTorpedos();
var entry = marky.stop('manTheTorpedos');

The entry will look something like:

{
  "entryType": "measure",
  "startTime": 1974112,
  "duration": 350,
  "name": "manTheTorpedos"
}

You can get all entries using:

var entries = marky.getEntries();

This provides a list of all measures ordered by startTime, e.g.:

[
  {
    "entryType": "measure",
    "startTime": 1974112,
    "duration": 350,
    "name": "numberOne"
  },
  {
    "entryType": "measure",
    "startTime": 1975108,
    "duration": 300,
    "name": "numberTwo"
  },
  {
    "entryType": "measure",
    "startTime": 1976127,
    "duration": 250,
    "name": "numberThree"
  }
]

You can also clear the entries using marky.clear():

marky.clear()

After this, marky.getEntries() will return an empty list. (If the User Timing API is supported, this will delete all the mark and measure entries from the timeline.)

Browser support

marky is tested in the following browsers/environments:

  • IE 9+
  • Safari 8+
  • iOS 8+
  • Android 4.4+
  • Chrome
  • Firefox
  • Edge
  • Node 4+

Per the spec, browsers only need to hold a minimum
of 150 entries in their Performance Timeline buffer. Notably Firefox throttles their buffer to 150, which for marky
means you can get a maximum of 50 entries from marky.getEntries() (because marky creates two marks and a measure).

If you need to get more than 50 entries from marky.getEntries(), you can do:

if (typeof performance !== 'undefined' && performance.setResourceTimingBufferSize) {
  performance.setResourceTimingBufferSize(10000); // or however many you need
}

In Node and browsers that don't support the User Timing API,
marky follows the behavior of Edge and Chrome, and does not limit the number of entries. marky.stop() and
marky.getEntries() will return pseudo-PerformanceEntry objects.

See also

  • appmetrics.js – a library on top of mark()/measure() which reports to Google Analytics.

Credits

Thanks to @toddreifsteck for feedback on this project and clarifications on the User Timing API.

Main metrics

Overview
Name With Ownernolanlawson/marky
Primary LanguageJavaScript
Program languageJavaScript (Language Count: 1)
Platform
License:Apache License 2.0
所有者活动
Created At2016-11-17 16:59:29
Pushed At2025-04-13 19:44:48
Last Commit At2025-04-13 12:44:37
Release Count12
Last Release Namev1.3.0 (Posted on 2025-04-13 12:44:37)
First Release Namev1.0.0 (Posted on )
用户参与
Stargazers Count1.1k
Watchers Count12
Fork Count43
Commits Count87
Has Issues Enabled
Issues Count13
Issue Open Count0
Pull Requests Count23
Pull Requests Open Count0
Pull Requests Close Count4
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private