Not in the top 1,000 by GitHub stars
EgorBo/BlazingFastDotnet
Tips & tricks to tune .NET workloads for better perf (mostly, targeting benchmarks).
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Instructions only
First observation → 02ed682fb675
No earlier version was observed for comparison.
Heat
5.9- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
blazing-fast-dotnet
When your agent uses it
High-performance .NET guidance for writing and tuning C# apps and benchmarks (BenchmarkDotNet, ASP.NET, challenges). Use when asked to make .NET code faster, reduce allocations or GC overhead, fix lock contention or thread pool starvation, inspect JIT codegen, profile apps, or tune runtime/NativeAOT settings.
What it loads into context
Frontmatter
75 tokensAlways available to the agent
SKILL.md
7,281 tokensWhen the skill is activated
Reference documents
500 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- dotnet-counters
- dotnet-trace
- Low-level profiling with Linux `perf`
- Popular low-level problems
- Inspecting JIT codegen
- Quick tips
- Strings and globalization
- Contention on shared state
- Safe vectorization (SIMD or SWAR)
- Generic specialization via static abstract members
Files
LICENSEasset1,063 bytesREADME.mddoc2,183 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesSKILL.mdcore30,577 bytesdummy.csasset67 bytes
Read SKILL.md
# Blazing Fast .NET Performance
> [!WARNING]
> Much of the advice here might not age well: as .NET evolves, old hacks and custom knobs may become obsolete or even detrimental. Apply only after careful consideration and testing. Revisit periodically to ensure continued relevance.
This skill focuses on optimizing .NET applications for maximum performance, providing tips, techniques, and best practices to achieve blazing-fast execution times. It targets .NET 10.0 and 11.0. Older versions have not been tested.
**Contents**
- [Profiling and Performance Analysis](#profiling-and-performance-analysis)
- [dotnet-counters](#dotnet-counters)
- [dotnet-trace](#dotnet-trace)
- [Low-level profiling with Linux `perf`](#low-level-profiling-with-linux-perf)
- [Popular low-level problems](#popular-low-level-problems)View the complete source on GitHubSkills included
- blazing-fast-dotnet
Repository facts
- License
- MIT
- Created
- Oct 23, 2026
- Last pushed
- Nov 1, 2026
- Forks
- 11
- Open issues
- 0
- Project activity
- Active
Before you install
Instructions onlyAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 12 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 28 network referencesin 2 files: SKILL.md:46 README.md:10
- No hidden or obfuscated text
- No instruction overrides
- No executable scripts
- No access to secrets
- No requests to vote in Hot
Show all 28 signals by file
README.md
- Network accessline 10
Read https://raw.githubusercontent.com/EgorBo/BlazingFastDotnet/main/SKILL.md and use it to - Network accessline 23
Inspect the current codebase for issues listed in https://raw.githubusercontent.com/dotnet/docs/refs/heads/main/docs/standard/unsafe-code/best-practices.md - Network accessline 29
The link points to a raw Markdown version of [this article](https://learn.microsoft.com/en-us/dotnet/standard/unsafe-code/best-practices). - Network accessline 35
- `ArrayPool<T>`: renting and returning buffers by hand is too error-prone, and I don't want to be responsible for the resulting use-after-return and double-return bugs. - Third-party dependencies: I'd like to minimize the number of depende - Network accessline 36
- Third-party dependencies: I'd like to minimize the number of dependencies. Currently, they are limited to: - [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet) - [FlameGraph](https://github.com/brendangregg/FlameGraph) (for - Network accessline 37
- [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet) - Network accessline 38
- [FlameGraph](https://github.com/brendangregg/FlameGraph) (for `perf` flame graphs)
SKILL.md
- Network accessline 46
[dotnet-counters](https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-counters) is a low-overhead, first-level triage tool. Run it while the app is under load: - Network accessline 54
See the `System.Runtime` [built-in metrics](https://learn.microsoft.com/dotnet/core/diagnostics/built-in-metrics-runtime) (.NET 9+) for what each counter means. - Network accessline 58
[dotnet-trace](https://learn.microsoft.com/dotnet/core/diagnostics/dotnet-trace) collects EventPipe traces on any OS without root or a native profiler (managed frames only): - Network accessline 67
dotnet-trace report trace.nettrace topN -n 20 # top methods (exclusive) as plain text dotnet-trace report trace.nettrace topN -n 20 --inclusive dotnet-trace convert trace.nettrace --format Speedscope # open in https://www.speedsco - Network accessline 69
dotnet-trace convert trace.nettrace --format Speedscope # open in https://www.speedscope.app - Network accessline 72
For more tips on using `dotnet-trace`, refer to the [dotnet-trace collection skill](https://raw.githubusercontent.com/dotnet/skills/refs/heads/main/plugins/dotnet-diag/skills/dotnet-trace-collect/SKILL.md). - Network accessline 105
# Generate flamegraph (svg) git clone --depth 1 --quiet https://github.com/brendangregg/FlameGraph || true - Network accessline 106
git clone --depth 1 --quiet https://github.com/brendangregg/FlameGraph || true - Network accessline 159
- Use [source-generated System.Text.Json](https://learn.microsoft.com/dotnet/standard/serialization/system-text-json/source-generation): pass generated `JsonTypeInfo<T>` to avoid reflection-based metadata discovery and enable supported seri - Network accessline 160
- Use [`[LoggerMessage]`](https://learn.microsoft.com/dotnet/core/extensions/logging/source-generation) source-generated logging to avoid template parsing, boxing, and temporary allocations. Still guard expensive argument computation with ` - Network accessline 161
- Use [`[GeneratedRegex]`](https://learn.microsoft.com/dotnet/standard/base-types/regular-expression-source-generators) for compile-time-known patterns instead of runtime pattern compilation. Preserve options, culture, and match timeouts. - Network accessline 168
- Use dictionary alternate lookups from spans: `dictionary.GetAlternateLookup<ReadOnlySpan<char>>()` avoids allocating temporary string keys when the comparer supports it. Use `TryGetAlternateLookup` when comparer support is not known. - Im - Network accessline 169
- Implement `IEquatable<T>` and a good `GetHashCode` for struct dictionary/set keys. This can avoid expensive default equality paths, boxing, and collision-heavy hashes. - Try [`TensorPrimitives`](https://learn.microsoft.com/dotnet/api/syst - Network accessline 170
- Try [`TensorPrimitives`](https://learn.microsoft.com/dotnet/api/system.numerics.tensors.tensorprimitives) before hand-vectorizing numeric operations. Its span-based implementations handle SIMD and tails; prefer it over manual SIMD loops o - Network accessline 171
- Prefer [`[LibraryImport]`](https://learn.microsoft.com/dotnet/standard/native-interop/pinvoke-source-generation) over `[DllImport]` for supported signatures to generate marshalling at build time; both `DllImport` and `LibraryImport` requi - Network accessline 172
- Use `static readonly` flags for genuinely immutable process-wide configuration. Optimized JIT code can fold their values and eliminate disabled branches. - Cache fields in locals in hot loops (`var items = _items;`). The JIT often can't d - Network accessline 173
- Cache fields in locals in hot loops (`var items = _items;`). The JIT often can't do it for you: calls and stores through references may modify the field, and the memory model restricts hoisting reads. Locals also enable bounds check elimi - Network accessline 174
- Consider `Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping` for UTF-8 JSON-only responses ([documentation](https://learn.microsoft.com/dotnet/standard/serialization/system-text-json/character-encoding#serialize-all-characters)). Neve - Network accessline 327
More info about vectorization and SIMD in .NET can be found in the [official documentation](https://learn.microsoft.com/en-us/dotnet/standard/simd). Also consider using [TensorPrimitives](https://learn.microsoft.com/dotnet/api/system.numeri - Network accessline 471
Recommended reading: Microsoft's [Optimizing AOT deployments](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/optimizing) article, plus the runtime's [CPU instruction-set tuning guide](https://github.com/dotnet/runtime/bl - Network accessline 489
- Consider filing a [dotnet/runtime](https://github.com/dotnet/runtime/issues) issue only for a clear, reproducible missed optimization in the JIT or libraries with meaningful measured impact. Check for duplicates, include a minimal repro a
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Signal confidence: 28 facts
- Network access in code of documentationREADME.md:10Low confidence
- Network access in code of documentationREADME.md:23Low confidence
- Network access in prose of documentationREADME.md:29Low confidence
- Network access in prose of documentationREADME.md:35Low confidence
- Network access in prose of documentationREADME.md:36Low confidence
- Network access in prose of documentationREADME.md:37Low confidence
- Network access in prose of documentationREADME.md:38Low confidence
- Network access in prose of the SKILL.mdSKILL.md:46Low confidence
- Network access in prose of the SKILL.mdSKILL.md:54Low confidence
- Network access in prose of the SKILL.mdSKILL.md:58Low confidence
- Network access in code of the SKILL.mdSKILL.md:67High confidence
- Network access in code of the SKILL.mdSKILL.md:69High confidence
- Network access in prose of the SKILL.mdSKILL.md:72Low confidence
- Network access in code of the SKILL.mdSKILL.md:105High confidence
- Network access in code of the SKILL.mdSKILL.md:106High confidence
- Network access in prose of the SKILL.mdSKILL.md:159Low confidence
- Network access in prose of the SKILL.mdSKILL.md:160Low confidence
- Network access in prose of the SKILL.mdSKILL.md:161Low confidence
- Network access in prose of the SKILL.mdSKILL.md:168Low confidence
- Network access in prose of the SKILL.mdSKILL.md:169Low confidence
- Network access in prose of the SKILL.mdSKILL.md:170Low confidence
- Network access in prose of the SKILL.mdSKILL.md:171Low confidence
- Network access in prose of the SKILL.mdSKILL.md:172Low confidence
- Network access in prose of the SKILL.mdSKILL.md:173Low confidence
- Network access in prose of the SKILL.mdSKILL.md:174Low confidence
- Network access in prose of the SKILL.mdSKILL.md:327Low confidence
- Network access in prose of the SKILL.mdSKILL.md:471Low confidence
- Network access in prose of the SKILL.mdSKILL.md:489Low confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.