Skip to content

Commit

Permalink
update some renderers
Browse files Browse the repository at this point in the history
  • Loading branch information
georgeharker committed Dec 4, 2024
1 parent cd42766 commit 6fa7e01
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 20 deletions.
1 change: 0 additions & 1 deletion pyinstrument/renderers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ def preprocess(self, root_frames: Dict[str, Frame | None] | None) -> Dict[str, F
frames = root_frames
if frames is not None:
for thread_id, frame in frames.items():
print(thread_id, frame)
for processor in self.processors:
frame = processor(frame, options=self.processor_options)
frames[thread_id] = frame
Expand Down
31 changes: 16 additions & 15 deletions pyinstrument/renderers/console.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,19 @@ def __init__(
def render(self, session: Session) -> str:
result = self.render_preamble(session)

frame = self.preprocess(session.root_frame())
frames = self.preprocess(session.root_frames())
indent = ". " if self.short_mode else ""

if frame is None:
if frames is None:
result += f"{indent}No samples were recorded.\n"
else:
self.root_frame = frame
self.root_frames = frames

if self.flat:
result += self.render_frame_flat(self.root_frame, indent=indent)
else:
result += self.render_frame(self.root_frame, indent=indent, child_indent=indent)
for thread_id, root_frame in frames.items():
if self.flat:
result += self.render_frame_flat(root_frame, indent=indent)
else:
result += self.render_frame(root_frame, indent=indent, child_indent=indent)

result += f"{indent}\n"

Expand Down Expand Up @@ -126,7 +127,7 @@ def should_render_frame_in_group(self, frame: Frame) -> bool:
assert frame.group
return (
frame.group.root == frame
or frame.total_self_time > 0.2 * self.root_frame.time
or frame.total_self_time > 0.2 * self.root_frames[frame.thread_id].time
or frame in frame.group.exit_frames
)

Expand Down Expand Up @@ -222,7 +223,7 @@ def walk(frame: Frame):
if not self.show_all:
# remove nodes that represent less than 0.1% of the total time
id_time_pairs = [
pair for pair in id_time_pairs if pair[1] / self.root_frame.time > 0.001
pair for pair in id_time_pairs if pair[1] / self.root_frames[frame.thread_id].time > 0.001
]

result = ""
Expand All @@ -235,7 +236,7 @@ def walk(frame: Frame):

def frame_description(self, frame: Frame, *, override_time: float | None = None) -> str:
time = override_time if override_time is not None else frame.time
time_color = self._ansi_color_for_time(time)
time_color = self._ansi_color_for_time(frame.thread_id, time)

if self.time == "percent_of_total":
time_str = f"{self.frame_proportion_of_total_time(time) * 100:.1f}%"
Expand All @@ -260,13 +261,13 @@ def frame_description(self, frame: Frame, *, override_time: float | None = None)

return f"{value_str} {function_str} {code_position_str}"

def frame_proportion_of_total_time(self, time: float) -> float:
if self.root_frame.time == 0:
def frame_proportion_of_total_time(self, thread_id: str, time: float) -> float:
if self.root_frames[thread_id].time == 0:
return 1
return time / self.root_frame.time
return time / self.root_frames[thread_id].time

def _ansi_color_for_time(self, time: float) -> str:
proportion_of_total = self.frame_proportion_of_total_time(time)
def _ansi_color_for_time(self, thread_id: str, time: float) -> str:
proportion_of_total = self.frame_proportion_of_total_time(thread_id, time)

if proportion_of_total > 0.6:
return self.colors.red
Expand Down
5 changes: 3 additions & 2 deletions pyinstrument/renderers/jsonrenderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,16 @@ def render_frame(self, frame: Frame | None):
return "{%s}" % ",".join(property_decls)

def render(self, session: Session):
frame = self.preprocess(session.root_frame())
frames = self.preprocess(session.root_frames())

property_decls: list[str] = []
property_decls.append('"start_time": %f' % session.start_time)
property_decls.append('"duration": %f' % session.duration)
property_decls.append('"sample_count": %d' % session.sample_count)
property_decls.append('"target_description": %s' % encode_str(session.target_description))
property_decls.append('"cpu_time": %f' % session.cpu_time)
property_decls.append('"root_frame": %s' % self.render_frame(frame))
property_decls.append('"root_frames": {%s}' % ','.join(
self.render_frame(frame) for frame in frames))

return "{%s}\n" % ",".join(property_decls)

Expand Down
1 change: 1 addition & 0 deletions pyinstrument/renderers/speedscope.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ def render_frame(self, frame: Frame | None) -> list[SpeedscopeEvent]:
return events_array

def render(self, session: Session):
# FIXME: this is known broken with threads
frame = self.preprocess(session.root_frame())

id_: str = time.strftime("%Y-%m-%dT%H-%M-%S", time.localtime(session.start_time))
Expand Down
3 changes: 1 addition & 2 deletions pyinstrument/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ def to_json(self, include_frame_records: bool = True):

return result

#FIXME: start time is per thread
@staticmethod
def from_json(json_dict: dict[str, Any]):
return Session(
Expand Down Expand Up @@ -148,7 +147,7 @@ def combine(session1: Session, session2: Session) -> Session:
def current_sys_prefixes() -> list[str]:
return [sys.prefix, sys.base_prefix, sys.exec_prefix, sys.base_exec_prefix]

# FIXME: remove
# FIXME: remove after converting all to this
def root_frame(self, trim_stem: bool = True) -> Frame | None:
return None

Expand Down

0 comments on commit 6fa7e01

Please sign in to comment.