OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <!-- | 2 <!-- |
3 Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 Copyright (c) 2012 The Chromium Authors. All rights reserved. |
4 Use of this source code is governed by a BSD-style license that can be | 4 Use of this source code is governed by a BSD-style license that can be |
5 found in the LICENSE file. | 5 found in the LICENSE file. |
6 --> | 6 --> |
7 | 7 |
8 <link rel="import" href="/tracing/base/base.html"> | 8 <link rel="import" href="/tracing/base/base.html"> |
9 <link rel="import" href="/tracing/base/event.html"> | 9 <link rel="import" href="/tracing/base/event.html"> |
10 <link rel="import" href="/tracing/base/interval_tree.html"> | 10 <link rel="import" href="/tracing/base/interval_tree.html"> |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
97 this.userFriendlyCategoryDrivers_ = []; | 97 this.userFriendlyCategoryDrivers_ = []; |
98 | 98 |
99 this.annotationsByGuid_ = {}; | 99 this.annotationsByGuid_ = {}; |
100 this.modelIndices = undefined; | 100 this.modelIndices = undefined; |
101 | 101 |
102 this.stats = new tr.model.ModelStats(); | 102 this.stats = new tr.model.ModelStats(); |
103 | 103 |
104 this.importWarnings_ = []; | 104 this.importWarnings_ = []; |
105 this.reportedImportWarnings_ = {}; | 105 this.reportedImportWarnings_ = {}; |
106 | 106 |
107 this.isTimeHighResolution_ = undefined; | 107 this.isTimeHighResolution_ = true; |
108 | 108 |
109 this.patchupsToApply_ = []; | 109 this.patchupsToApply_ = []; |
110 | 110 |
111 this.doesHelperGUIDSupportThisModel_ = {}; | 111 this.doesHelperGUIDSupportThisModel_ = {}; |
112 this.helpersByConstructorGUID_ = {}; | 112 this.helpersByConstructorGUID_ = {}; |
113 } | 113 } |
114 | 114 |
115 Model.prototype = { | 115 Model.prototype = { |
116 __proto__: tr.model.EventContainer.prototype, | 116 __proto__: tr.model.EventContainer.prototype, |
117 | 117 |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 | 386 |
387 set intrinsicTimeUnit(value) { | 387 set intrinsicTimeUnit(value) { |
388 if (this.intrinsicTimeUnit_ === value) | 388 if (this.intrinsicTimeUnit_ === value) |
389 return; | 389 return; |
390 if (this.intrinsicTimeUnit_ !== undefined) | 390 if (this.intrinsicTimeUnit_ !== undefined) |
391 throw new Error('Intrinsic time unit already set'); | 391 throw new Error('Intrinsic time unit already set'); |
392 this.intrinsicTimeUnit_ = value; | 392 this.intrinsicTimeUnit_ = value; |
393 }, | 393 }, |
394 | 394 |
395 get isTimeHighResolution() { | 395 get isTimeHighResolution() { |
396 if (this.isTimeHighResolution_ === undefined) | |
397 this.isTimeHighResolution_ = this.isTimeHighResolutionHeuristic_(); | |
398 return this.isTimeHighResolution_; | 396 return this.isTimeHighResolution_; |
399 }, | 397 }, |
400 | 398 |
401 set isTimeHighResolution(value) { | 399 set isTimeHighResolution(value) { |
402 if (this.isTimeHighResolution_ === value) | |
403 return; | |
404 if (this.isTimeHighResolution_ !== undefined) | |
405 throw new Error('isTimeHighResolution already set'); | |
406 this.isTimeHighResolution_ = value; | 400 this.isTimeHighResolution_ = value; |
407 }, | 401 }, |
408 | 402 |
409 /** | 403 /** |
410 * Returns a link to a trace data file that this model was imported from. | 404 * Returns a link to a trace data file that this model was imported from. |
411 * This is NOT the URL of a site being traced, but instead an indicator of | 405 * This is NOT the URL of a site being traced, but instead an indicator of |
412 * where the data is stored. | 406 * where the data is stored. |
413 */ | 407 */ |
414 get canonicalUrl() { | 408 get canonicalUrl() { |
415 return this.canonicalUrl_; | 409 return this.canonicalUrl_; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 this.patchupsToApply_ = unresolved; | 560 this.patchupsToApply_ = unresolved; |
567 }, | 561 }, |
568 | 562 |
569 replacePIDRefsInPatchups: function(old_pid_ref, new_pid_ref) { | 563 replacePIDRefsInPatchups: function(old_pid_ref, new_pid_ref) { |
570 this.patchupsToApply_.forEach(function(patchup) { | 564 this.patchupsToApply_.forEach(function(patchup) { |
571 if (patchup.pidRef === old_pid_ref) | 565 if (patchup.pidRef === old_pid_ref) |
572 patchup.pidRef = new_pid_ref; | 566 patchup.pidRef = new_pid_ref; |
573 }); | 567 }); |
574 }, | 568 }, |
575 | 569 |
576 isTimeHighResolutionHeuristic_: function() { | |
577 if (this.intrinsicTimeUnit !== tr.v.TimeDisplayModes.ms) | |
578 return false; | |
579 // If the timer is only precise to the millisecond, then almost all event | |
580 // will be precisely X ms apart. We check that by looking at the | |
581 // decimal part of each event's start time. We create 100 bins for | |
582 // these fractions. If at least 90% of the events are in the same bin then | |
583 // the timer is deemed to be low resolution. | |
584 var nbEvents = 0; | |
585 var nbPerBin = []; | |
586 var maxEvents = 0; | |
587 for (var i = 0; i < 100; ++i) | |
588 nbPerBin.push(0); | |
589 this.iterateAllEvents(function(event) { | |
590 nbEvents++; | |
591 if (event.start !== undefined) { | |
592 // Compute | |
593 var remainder = Math.floor( | |
594 (event.start - Math.floor(event.start)) * 100); | |
595 nbPerBin[remainder]++; | |
596 maxEvents = Math.max(maxEvents, nbPerBin[remainder]); | |
597 } | |
598 }); | |
599 // If there are too few events our heuristic is not very good, assume the | |
600 // timer is high resolution. | |
601 if (nbEvents < 100) | |
602 return true; | |
603 // If more than 90% of the events are snapped precisely on milliseconds | |
604 // boundary we got a trace with a low resolution timer. | |
605 return (maxEvents / nbEvents) < 0.9; | |
606 }, | |
607 | |
608 /** | 570 /** |
609 * Called by the model to join references between objects, after final model | 571 * Called by the model to join references between objects, after final model |
610 * bounds have been computed. | 572 * bounds have been computed. |
611 */ | 573 */ |
612 joinRefs: function() { | 574 joinRefs: function() { |
613 this.joinObjectRefs_(); | 575 this.joinObjectRefs_(); |
614 this.applyObjectRefPatchups(); | 576 this.applyObjectRefPatchups(); |
615 }, | 577 }, |
616 | 578 |
617 joinObjectRefs_: function() { | 579 joinObjectRefs_: function() { |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 | 649 |
688 iterObjectFieldsRecursively(item.args); | 650 iterObjectFieldsRecursively(item.args); |
689 } | 651 } |
690 }; | 652 }; |
691 | 653 |
692 return { | 654 return { |
693 Model: Model | 655 Model: Model |
694 }; | 656 }; |
695 }); | 657 }); |
696 </script> | 658 </script> |
OLD | NEW |