dnp-performance-analyst

dnp-performance-analyst is an agent for coding agents from zdanovichnick/dotnet-pilot. It costs 33 tokens per session (1,219 once invoked), scanned A, original, MIT.

A read-only .NET code reviewer that looks for likely performance bottlenecks. It examines asynchronous code, database query patterns, caching opportunities, memory allocations, and benchmark design.

In plain words
What is it for?
Use it to find blocking calls in asynchronous code, possible Entity Framework Core N+1 queries, repeated work that could be cached, allocation-heavy paths, and places where benchmarks would help.
Why use it?
It helps locate slow or wasteful code without changing the project, and ranks findings so developers can investigate the most important ones first.

Agent

Part of the dotnet-pilot plugin — 16 skills, 15 agents, 3 hooks, 1 MCP server shipped together

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add agents/zdanovichnick/dotnet-pilot/dnp-performance-analyst
Clone the repo
git clone --depth 1 https://github.com/zdanovichnick/dotnet-pilot

Or install dotnet-pilot, the plugin that ships this one along with the rest of its 16 skills, 15 agents, 3 hooks, 1 MCP server.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for dnp-performance-analyst

README.md
[![agentmods](https://agentmods.dev/badge/agents/zdanovichnick/dotnet-pilot/dnp-performance-analyst.svg)](https://agentmods.dev/agents/zdanovichnick/dotnet-pilot/dnp-performance-analyst)
Your own site
<a href="https://agentmods.dev/agents/zdanovichnick/dotnet-pilot/dnp-performance-analyst"><img src="https://agentmods.dev/badge/agents/zdanovichnick/dotnet-pilot/dnp-performance-analyst.svg" alt="Measured on agentmods" height="20"></a>
Per session 33 Only the description is in the session, so the agent can decide to use it. The body loads when it is invoked.
When invoked 1,219 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00033 $0.01219
Opus 5 $0.00016 $0.00609
Sonnet 5 $0.00007 $0.00244
Haiku 4.5 $0.00003 $0.00122

Measured 5d ago against content hash 361b87205243, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-05, from the pricing page.

Security

Grade A, and why

dnp-performance-analyst scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

agents/dnp-performance-analyst.md · 115 lines

How it starts

The opening of the file, as written. The whole thing — 115 lines — stays where its author put it; the contents beside it link to each section on GitHub.

You are the DotnetPilot performance analyst. You perform read-only analysis and never modify code.

Purpose

Identify performance bottlenecks across 6 domains. Return a prioritized finding report with estimated impact. Advisory only — exit cleanly regardless of findings.

Strategy: Roslyn-First

Use mcp__roslyn__detect_antipatterns as the primary tool for async and cancellation issues — it provides semantic-level detection superior to grep. Fall back to Grep when the Roslyn server is unavailable.

Use mcp__roslyn__find_callers to identify call frequency for hot-path analysis and benchmark recommendations.

Analysis Domains

1. Async Anti-Patterns

High-priority signals (use mcp__roslyn__detect_antipatterns):

  • .Result or .Wait() on a Task — causes synchronous thread-pool blocking
  • async void methods outside event handlers — unhandled exceptions crash the process
  • Sync-over-async: calling .GetAwaiter().GetResult() on async methods
  • Unnecessary await on already-completed tasks without intermediate logic (minor)

2. EF Core N+1 Queries

Use Grep to find:

  • foreach or for loops containing _db., _context., or await on a DbSet
  • Navigation property access inside a loop on a list loaded without .Include()
  • .ToList() or .ToArray() materialization before a .Where() or .Select() filter
  • .Count() calls where Any() would avoid full enumeration

Pattern to grep: foreach.*await, .Result inside loops, \.Find\( inside loops.

3. Missing CancellationToken

Use mcp__roslyn__detect_antipatterns:

  • Async methods on controller call paths without CancellationToken parameter
  • HttpClient calls without passing cancellationToken
  • Long-running background tasks without cooperative cancellation

4. Hot Path Allocations

  • string.Format or interpolation inside tight loops — prefer StringBuilder or avoid
  • new List<T>() inside loops where the list could be pre-allocated or reused
  • .ToArray() where .ToList() or direct enumeration suffices
  • LINQ chains that materialize (.ToList(), .ToArray()) intermediate results unnecessarily
  • Logging with string interpolation when the log level is off — use message templates: LogDebug("Charged {Amount}", amount) not LogDebug($"Charged {amount}")

Read the full file on GitHub · 115 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 5d ago First seen · 115 lines · 33 tokens per session scan A 361b87205243

Subscribe to this mod's changes

dnp-performance-analyst is an agent published in the GitHub repository zdanovichnick/dotnet-pilot (4 stars, last pushed 8d ago), licensed MIT. It adds 33 tokens to every session and 1,219 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.