- From: Arvind Jain <arvind@google.com>
- Date: Tue, 25 Feb 2014 21:51:52 -0800
- To: Joshua Peek <josh@joshpeek.com>
- Cc: public-web-perf <public-web-perf@w3.org>
- Message-ID: <CAOYaDdOp4cZFHm=nWs8v9OtQDZnXgcBTv65q+H1Awg1dDCwa7A@mail.gmail.com>
Seems like a good idea. Does anyone else have comments?
On Mon, Feb 17, 2014 at 9:33 AM, Joshua Peek <josh@joshpeek.com> wrote:
> Navigation and user timings have been useful to gather and analysis on
> the server side. Though, its a bit tricky to build tools that just
> take that data and upload it to a server. Theres no notification when
> new performance entries have been recorded. This requires invasive
> code to recheck the performance entries buffer.
>
> var seen = 0;
> function reportPerformance() {
> var entries = performance.getEntries();
> var newEntries = entries.slice(seen);
> seen = entries.length;
> if (newEntries.length) {
> navigator.sendBeacon("/stats",
> JSON.stringify(newEntries));
> }
> });
>
> // gather all entries from initial load
> window.addEventListener("load", function() {
> reportPerformance();
> });
>
> // report script timing after async script loads
> var script = document.createElement("script");
> script.src = "/async-script.js";
> script.onload = reportPerformance;
> document.head.appendChild(script);
>
> // report user timing
> window.performance.mark("mark_fully_loaded");
> reportPerformance();
>
> And knowing when its safe to read performance.timing stats has a small
> edge case.
>
> window.addEventListener("load", function() {
> performance.timing.loadEventEnd; // 0
> setTimeout(function() {
> performance.timing.loadEventEnd; // 123
> }, 0);
> });
>
> It would be helpful to receive an event or callback when the browser
> knows there are new performance entries available. This should cover
> any resource and user timings. Anything that will add new entries to
> `performance.getEntries()`. The notification should not even be
> synchronous. Batching and throttling the notification would be up to
> the browser.
>
> As of the NavigationTiming2 spec, the Performance interface is already
> an EventTarget. Heres an example of using a fictitious event name with
> to log client performance timings back to a server backend.
>
> performance.addEventListener("entries", function(event) {
> navigator.sendBeacon("/stats",
> JSON.stringify(event.newEntries));
> });
>
>
> And maybe even add an event or promise for navigation timing readiness.
>
> performance.timing.ready().then(function() {
> navigator.sendBeacon("/stats",
> JSON.stringify(performance.timing));
> });
>
>
Received on Wednesday, 26 February 2014 05:52:32 UTC