function toMarkdown()

in middleware/utils/pprofConverter.js [101:139]


function toMarkdown(data) {
  let md = [`# CPU Profile Analysis\n\n`];
  md.push(`**Time:** ${data.metadata.time}\n\n`);
  md.push(`**Samples:** ${data.metadata.shown_samples} of ${data.metadata.total_samples} (${data.metadata.shown_percent}%)\n\n`);
  md.push(`**Dropped Nodes:** ${data.metadata.dropped_nodes}\n\n`);
  
  md.push(`## Profile Data\n\n`);
  md.push(`| Flat Samples | Flat % | Sum % | Cum Samples | Cum % | Function |\n`);
  md.push(`|-------------|--------|-------|-------------|-------|----------|\n`);
  
  for (const entry of data.profile_entries) {
    md.push(`| ${entry.flat_samples} | ${entry.flat_percent}% | ${entry.sum_percent}% | ` +
           `${entry.cum_samples} | ${entry.cum_percent}% | \`${entry.function}\` |\n`);
  }
  
  // Add summary section with insights
  md.push(`\n## Performance Insights\n\n`);
  
  // Top functions by flat and cumulative time
  const flatTop = [...data.profile_entries]
    .sort((a, b) => b.flat_samples - a.flat_samples)
    .slice(0, 5);
    
  const cumTop = [...data.profile_entries]
    .sort((a, b) => b.cum_samples - a.cum_samples)
    .slice(0, 5);
  
  md.push(`### Top Functions by Self Time\n\n`);
  flatTop.forEach((entry, i) => {
    md.push(`${i+1}. \`${entry.function}\` - ${entry.flat_percent}% of total time\n`);
  });
  
  md.push(`\n### Top Functions by Cumulative Time\n\n`);
  cumTop.forEach((entry, i) => {
    md.push(`${i+1}. \`${entry.function}\` - ${entry.cum_percent}% of total time\n`);
  });
  
  return md.join('');
}