Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Fix some edge cases
  • Loading branch information
pablogsal committed Dec 1, 2025
commit a276b42fc2d883224f5231a3ffafc5c559f8553d
26 changes: 14 additions & 12 deletions Lib/profiling/sampling/flamegraph.js
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ function updateStatusBar(nodeData, rootValue) {
const filename = resolveString(nodeData.filename) || "";
const lineno = nodeData.lineno;
const timeMs = (nodeData.value / 1000).toFixed(2);
const percent = ((nodeData.value / rootValue) * 100).toFixed(1);
const percent = rootValue > 0 ? ((nodeData.value / rootValue) * 100).toFixed(1) : "0.0";

const locationEl = document.getElementById('status-location');
const funcItem = document.getElementById('status-func-item');
Expand Down Expand Up @@ -890,7 +890,7 @@ function filterByThread() {
if (selectedThread === 'all') {
filteredData = originalData;
} else {
selectedThreadId = parseInt(selectedThread);
selectedThreadId = parseInt(selectedThread, 10);
filteredData = filterDataByThread(originalData, selectedThreadId);

if (filteredData.strings) {
Expand Down Expand Up @@ -956,17 +956,19 @@ function resetZoom() {

function exportSVG() {
const svgElement = document.querySelector("#chart svg");
if (svgElement) {
const serializer = new XMLSerializer();
const svgString = serializer.serializeToString(svgElement);
const blob = new Blob([svgString], { type: "image/svg+xml" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "python-performance-flamegraph.svg";
a.click();
URL.revokeObjectURL(url);
if (!svgElement) {
console.warn("Cannot export: No flamegraph SVG found");
return;
}
const serializer = new XMLSerializer();
const svgString = serializer.serializeToString(svgElement);
const blob = new Blob([svgString], { type: "image/svg+xml" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = "python-performance-flamegraph.svg";
a.click();
URL.revokeObjectURL(url);
}

// ============================================================================
Expand Down
4 changes: 2 additions & 2 deletions Lib/profiling/sampling/sample.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,10 +112,10 @@ def sample(self, collector, duration_sec=10):
if self.realtime_stats and len(self.sample_intervals) > 0:
print() # Add newline after real-time stats

sample_rate = num_samples / running_time
sample_rate = num_samples / running_time if running_time > 0 else 0
error_rate = (errors / num_samples) * 100 if num_samples > 0 else 0
expected_samples = int(duration_sec / sample_interval_sec)
missed_samples = (expected_samples - num_samples) / expected_samples * 100
missed_samples = (expected_samples - num_samples) / expected_samples * 100 if expected_samples > 0 else 0

# Don't print stats for live mode (curses is handling display)
is_live_mode = LiveStatsCollector is not None and isinstance(collector, LiveStatsCollector)
Expand Down
Loading