Time profiler emits relative timestamps for events (the number of microseconds passed since the start of the current process). This patch allows combining events from different processes while preserving their relative timing by emitting a new attribute "beginningOfTime". This attribute contains the system time that corresponds to the zero timestamp of the time profiler. This has at least two use cases: - Build systems can use this to merge time traces from multiple compiler invocations and generate statistics for the whole build. Tools like ClangBuildAnalyzer could also leverage this feature. - Compilers that use LLVM as their backend by invoking llc/opt in a child process. If such a compiler supports generating time traces of its own events, it could merge those events with LLVM-specific events received from llc/opt, and produce a more complete time trace. A proof-of-concept script that merges multiple logs that contain a synchronization point into one log: https://github.com/broadwaylamb/merge_trace_events Differential Revision: https://reviews.llvm.org/D78030
37 lines
1.4 KiB
Python
37 lines
1.4 KiB
Python
#!/usr/bin/env python
|
|
|
|
import json, sys, time
|
|
|
|
def is_inside(range1, range2):
|
|
a = range1["ts"]; b = a + range1["dur"]
|
|
c = range2["ts"]; d = c + range2["dur"]
|
|
return (a >= c and a <= d) and (b >= c and b <= d)
|
|
|
|
def is_before(range1, range2):
|
|
b = range1["ts"] + range1["dur"]; c = range2["ts"]
|
|
return b <= c
|
|
|
|
log_contents = json.loads(sys.stdin.read())
|
|
events = log_contents["traceEvents"]
|
|
codegens = [event for event in events if event["name"] == "CodeGen Function"]
|
|
frontends = [event for event in events if event["name"] == "Frontend"]
|
|
backends = [event for event in events if event["name"] == "Backend"]
|
|
|
|
beginning_of_time = log_contents["beginningOfTime"] / 1000000
|
|
seconds_since_epoch = time.time()
|
|
|
|
# Make sure that the 'beginningOfTime' is not earlier than 10 seconds ago
|
|
# and not later than now.
|
|
if beginning_of_time > seconds_since_epoch or \
|
|
seconds_since_epoch - beginning_of_time > 10:
|
|
sys.exit("'beginningOfTime' should represent the absolute time when the "
|
|
"process has started")
|
|
|
|
if not all([any([is_inside(codegen, frontend) for frontend in frontends])
|
|
for codegen in codegens]):
|
|
sys.exit("Not all CodeGen sections are inside any Frontend section!")
|
|
|
|
if not all([all([is_before(frontend, backend) for frontend in frontends])
|
|
for backend in backends]):
|
|
sys.exit("Not all Frontend section are before all Backend sections!")
|