|
1 | 1 | /// <reference path="../../../../angular2/typings/node/node.d.ts" /> |
2 | 2 |
|
3 | | -var file = require('sdk/io/file'); |
4 | | -var {Cc, Ci, Cu} = require("chrome"); |
| 3 | +var {Cc, Ci, Cu} = require('chrome'); |
| 4 | +var os = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService); |
| 5 | +var ParserUtil = require('./parser_util'); |
5 | 6 |
|
6 | 7 | class Profiler { |
7 | 8 | private _profiler; |
8 | | - constructor() { this._profiler = Cc["@mozilla.org/tools/profiler;1"].getService(Ci.nsIProfiler); } |
| 9 | + private _markerEvents: List<any>; |
| 10 | + private _profilerStartTime: number; |
9 | 11 |
|
10 | | - start(entries, interval, features) { |
| 12 | + constructor() { this._profiler = Cc['@mozilla.org/tools/profiler;1'].getService(Ci.nsIProfiler); } |
| 13 | + |
| 14 | + start(entries, interval, features, timeStarted) { |
11 | 15 | this._profiler.StartProfiler(entries, interval, features, features.length); |
| 16 | + this._profilerStartTime = timeStarted; |
| 17 | + this._markerEvents = []; |
12 | 18 | } |
13 | 19 |
|
14 | 20 | stop() { this._profiler.StopProfiler(); } |
15 | | - getProfileData() { return this._profiler.getProfileData(); } |
16 | | -} |
17 | 21 |
|
| 22 | + getProfilePerfEvents() { |
| 23 | + var profileData = this._profiler.getProfileData(); |
| 24 | + var perfEvents = ParserUtil.convertPerfProfileToEvents(profileData); |
| 25 | + perfEvents = this._mergeMarkerEvents(perfEvents); |
| 26 | + perfEvents.sort(function(event1, event2) { return event1.ts - event2.ts; }); // Sort by ts |
| 27 | + return perfEvents; |
| 28 | + } |
| 29 | + |
| 30 | + _mergeMarkerEvents(perfEvents: List<any>): List<any> { |
| 31 | + this._markerEvents.forEach(function(markerEvent) { perfEvents.push(markerEvent); }); |
| 32 | + return perfEvents; |
| 33 | + } |
| 34 | + |
| 35 | + addStartEvent(name: string, timeStarted: number) { |
| 36 | + this._markerEvents.push({ph: 'b', ts: timeStarted - this._profilerStartTime, name: name}); |
| 37 | + } |
18 | 38 |
|
19 | | -function saveToFile(savePath: string, body: string) { |
20 | | - var textWriter = file.open(savePath, 'w'); |
21 | | - textWriter.write(body); |
22 | | - textWriter.close(); |
| 39 | + addEndEvent(name: string, timeEnded: number) { |
| 40 | + this._markerEvents.push({ph: 'e', ts: timeEnded - this._profilerStartTime, name: name}); |
| 41 | + } |
23 | 42 | } |
24 | 43 |
|
25 | 44 | function forceGC() { |
26 | 45 | Cu.forceGC(); |
27 | | - var os = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); |
28 | | - os.notifyObservers(null, "child-gc-request", null); |
29 | | -} |
30 | | - |
31 | | -var profiler = new Profiler(); |
32 | | -function startProfiler() { |
33 | | - profiler.start(/* = profiler memory */ 10000000, 1, ['leaf', 'js', "stackwalk", 'gc']); |
| 46 | + os.notifyObservers(null, 'child-gc-request', null); |
34 | 47 | }; |
35 | | -function stopAndRecord(filePath) { |
36 | | - var profileData = profiler.getProfileData(); |
37 | | - profiler.stop(); |
38 | | - saveToFile(filePath, JSON.stringify(profileData, null, 2)); |
39 | | -}; |
40 | | - |
41 | 48 |
|
42 | | -var mod = require("sdk/page-mod"); |
43 | | -var data = require("sdk/self").data; |
| 49 | +var mod = require('sdk/page-mod'); |
| 50 | +var data = require('sdk/self').data; |
| 51 | +var profiler = new Profiler(); |
44 | 52 | mod.PageMod({ |
45 | 53 | include: ['*'], |
46 | | - contentScriptFile: data.url("installed_script.js"), |
| 54 | + contentScriptFile: data.url('installed_script.js'), |
47 | 55 | onAttach: worker => { |
48 | | - worker.port.on('startProfiler', () => startProfiler()); |
49 | | - worker.port.on('stopAndRecord', filePath => stopAndRecord(filePath)); |
50 | | - worker.port.on('forceGC', () => forceGC()); |
| 56 | + worker.port.on('startProfiler', |
| 57 | + (timeStarted) => profiler.start(/* = profiler memory */ 1000000, 1, |
| 58 | + ['leaf', 'js', 'stackwalk', 'gc'], timeStarted)); |
| 59 | + worker.port.on('stopProfiler', () => profiler.stop()); |
| 60 | + worker.port.on('getProfile', |
| 61 | + () => worker.port.emit('perfProfile', profiler.getProfilePerfEvents())); |
| 62 | + worker.port.on('forceGC', forceGC); |
| 63 | + worker.port.on('markStart', (name, timeStarted) => profiler.addStartEvent(name, timeStarted)); |
| 64 | + worker.port.on('markEnd', (name, timeEnded) => profiler.addEndEvent(name, timeEnded)); |
51 | 65 | } |
52 | 66 | }); |
0 commit comments