forked from area9innovation/flow9
-
Notifications
You must be signed in to change notification settings - Fork 0
/
tracer.flow
50 lines (40 loc) · 1.76 KB
/
tracer.flow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import ds/list;
import runtime;
import formats/json/json;
// A helper, which can produce a trace file in the Google Chrome trace format
// https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview
// These files can be analyzed and viewed using Chrome:
// http://dev.chromium.org/developers/how-tos/trace-event-profiling-tool
export {
makeTracer() -> Tracer;
Tracer(startTime : double, mutable lines : List<TraceEntry>);
TraceEntry(name : string, category : string, phase : string, tid : int, time : double /*ms*/);
logTraceEntry(tracer : Tracer, category : string, name : string, phase :string, tid : int) -> void;
// Do the work function, and record start and end
traceWork(tracer : Tracer, category : string, name : string, tid : int, work : () -> void) -> void;
writeTraceFile(t : Tracer, filename : string) -> bool;
}
makeTracer() {
Tracer(timestamp(), makeList());
}
logTraceEntry(tracer : Tracer, category : string, name : string, phase :string, tid : int) -> void {
tracer.lines ::= Cons(TraceEntry(name, category, phase, tid, timestamp() - tracer.startTime), tracer.lines);
}
traceWork(tracer : Tracer, category : string, name : string, tid : int, work : () -> void) -> void {
logTraceEntry(tracer, category, name, "B", tid);
work();
logTraceEntry(tracer, category, name, "E", tid);
}
writeTraceFile(t : Tracer, filename : string) -> bool {
lines = mapList(t.lines, \e : TraceEntry -> {
json2string(JsonObject([
Pair("name", JsonString(e.name)),
Pair("cat", JsonString(e.category)),
Pair("ph", JsonString(e.phase)),
Pair("pid", JsonDouble(0.0)), // For now, just hardcoded
Pair("tid", JsonDouble(i2d(e.tid))),
Pair("ts", JsonDouble(e.time)),
]));
});
setFileContent(filename, strGlue(list2array(lines), "\n"));
}