Package Exports
- marky
- marky/lib/marky.browser.cjs.js
- marky/lib/marky.browser.es.js
- marky/lib/marky.cjs.js
- marky/lib/marky.es.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (marky) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
marky 
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:
As well as Edge F12 Tools:
This is because marky
adds standard
PerformanceEntries to the Performance Timeline. In principle other browsers and analytics providers can use the same data.
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"
}
]
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.
Credits
Thanks to @toddreifsteck for feedback on this project and clarifications on the User Timing API.