luau/tools/perfgraph.py
Arseny Kapoulkine d01addc625 Sync to upstream/release/501 (#20)
Co-authored-by: Rodactor <rodactor@roblox.com>
2021-11-01 14:52:34 -07:00

52 lines
1.4 KiB
Python

#!/usr/bin/python
# This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
# Given a profile dump, this tool generates a flame graph based on the stacks listed in the profile
# The result of analysis is a .svg file which can be viewed in a browser
import sys
import svg
class Node(svg.Node):
def __init__(self):
svg.Node.__init__(self)
self.function = ""
self.source = ""
self.line = 0
self.ticks = 0
def text(self):
return self.function
def title(self):
if self.line > 0:
return "{}\n{}:{}".format(self.function, self.source, self.line)
else:
return self.function
def details(self, root):
return "Function: {} [{}:{}] ({:,} usec, {:.1%}); self: {:,} usec".format(self.function, self.source, self.line, self.width, self.width / root.width, self.ticks)
with open(sys.argv[1]) as f:
dump = f.readlines()
root = Node()
for l in dump:
ticks, stack = l.strip().split(" ", 1)
node = root
for f in reversed(stack.split(";")):
source, function, line = f.split(",")
child = node.child(f)
child.function = function
child.source = source
child.line = int(line) if len(line) > 0 else 0
node = child
node.ticks += int(ticks)
svg.layout(root, lambda n: n.ticks)
svg.display(root, "Flame Graph", "hot", flip = True)