- From: Zhiheng Wang <zhihengw@google.com>
- Date: Wed, 18 May 2011 12:53:14 -0700
- To: Tony Gentilcore <tonyg@google.com>
- Cc: public-web-perf@w3.org
- Message-ID: <BANLkTi=5j9dzSwty-QsbH3nFyuaY6TyBKw@mail.gmail.com>
Thanks, Tony. I like this. It's simple yet caters the most common usages. On Wed, May 18, 2011 at 4:44 AM, Tony Gentilcore <tonyg@google.com> wrote: > As discussed on last week's call, here's one way to tie marks and measures > into the same concept while still preserving the functionality of both. It > largely boils down to semantics. > > *Overview* > > void mark(in DOMString name); > Can we also support a given timestamp as optional input? e.g., void mark(in DOMString name, in optional unsigned long long timestamp); > unsigned long long markEnd(in DOMString name); > Similar to the current measure(), shall we expand this interface to something like: unsigned long long markEnd(in DOMString start_mark, in optional DOMString name, in optional DOMString end_mark); > Object getMarks(in optional DOMString name); > void clearMarks(in optional DOMString name); > > *Examples to illustrate behavior* > > 1. Measure something: > > mark("sleep3"); > sleep(3); > markEnd("sleep3"); > > 3 > getMarks() > > { "sleep3": [ { "t": 1305712151745, "dur": 3 } ] } > I wonder if there are better key for "t" and "dur"... > > 2. Clear everything: > > clearMarks() > getMarks() > > { } > > 3. Create a new mark: > > mark(performance.MARK_FULLY_LOADED) > getMarks() > > { "fullyLoaded": [ { "t": 1305712151745 } ] } > > 4. Improper usage (no start): > > clearMarks() > markEnd("doesNotExist") > > 0 > getMarks() > > { } > > 5. Improper usage (end twice): > > mark("doubleEnd") > sleep(2); > markEnd("doubleEnd") > > 2 > sleep(2); > markEnd("doubleEnd") > > 4 > getMarks() > > { "doubleEnd": [ { "t": 1305712151745, "dur": 4 } ] } > > *Advantages over current draft* > > 1. To get the all data, analytics scripts only need to call one method > (getMarks) rather than two (getMarks+getMeasures). > > 2. Previously measures weren't strongly tied to marks so a timeline > couldn't be reconstructed without knowledge of the page. > > Consider the old case: > mark("foo"); > mark("foo"); > measure("bar", "foo"); > getMarks(); > > { "foo": [1305712151745, 1305712151747] } > getMeasures(); > > { "bar": [1] } > > Based only on the getMarks+getMeasures data, the "bar" measure cannot be > placed on a timeline because it isn't known which "foo" it is associated > with (or even that it is associated with "foo" at all). > > Now the new case: > mark("foo"); > mark("foo"); > markEnd("foo"); > getMarks(); > > { "sleep3": [ { "t": 1305712151745 }, { "t": 1305712151747, "dur": 1 } ] > } > > The getMarks() data now allows complete reconstruction of the timeline. > yay, this seems to be a big plus to me. cheers, Zhiheng > > 3. There is no ambiguity about clearing marks vs clearing measures. > > Consider the old case: > mark("foo") > measure("bar", "foo") > clearMarks("foo") > // At this point, it may be unclear to the user what getMeasures() should > return. Since bar is based on foo and foo was cleared: does that mean bar is > now associated with fetchStart or has it been cleared or is it still > associated with foo even though foo is gone? I believe we intend the 3rd, > but I'm not sure that would be obvious to users. > > 4. Simpler to use as there is only one verb "mark" and fewer methods to > understand. Each method now takes just one argument that is the same across > all methods. Previously, it wasn't at all obvious what to pass to measure() > and in what order without looking it up. > > Thoughts? > > -Tony >
Received on Wednesday, 18 May 2011 19:53:39 UTC