-
Notifications
You must be signed in to change notification settings - Fork 0
V0.5.1/service update #18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
f07e6a5
f0f6cc1
96e428a
c3fe13e
9cd361c
78eb148
537170f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,164 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mode: agent | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| description: 'Writing Performance Benchmarks' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # Benchmark Fixture Prompt (Tuning Benchmarks) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| This prompt defines how to generate performance tests (“benchmarks”) for a project/solution using BenchmarkDotNet. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Benchmarks are *not* unit tests — they are micro- or component-level performance measurements that belong under the `tuning/` directory and follow strict conventions. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Copilot must follow these guidelines when generating benchmark fixtures. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 1. Naming and Placement | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - All benchmark projects live under the `tuning/` folder. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Examples: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - `tuning/<ProjectName>.Benchmarks/` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - `tuning/<ProjectName>.Console.Benchmarks/` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| - **Namespaces must NOT end with `.Benchmarks`.** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| They must mirror the production assembly’s namespace. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Example: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| If benchmarking a type inside `YourProject.Console`, then: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```csharp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| namespace YourProject.Console | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public class Sha512256Benchmark { … } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * **Benchmark class names must end with `Benchmark`.** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Example: `DateSpanBenchmark`, `FowlerNollVoBenchmark`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Benchmark files should be located in the matching benchmark project | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| (e.g., benchmarks for `YourProject.Console` go in `YourProject.Console.Benchmarks.csproj`). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * In the `.csproj` for each benchmark project, set the root namespace to the production namespace, for example: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```xml | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <RootNamespace>YourProject.Console</RootNamespace> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 2. Attributes and Configuration | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Each benchmark class should use: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```csharp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [MemoryDiagnoser] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Optional but strongly recommended where meaningful: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `[Params(...)]` — define small, medium, large input sizes. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `[GlobalSetup]` — deterministic initialization of benchmark data. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `[Benchmark(Description = "...")]` — always add descriptions. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `[Benchmark(Baseline = true)]` — when comparing two implementations. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Avoid complex global configs; prefer explicit attributes inside the class. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 3. Structure and Best Practices | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| A benchmark fixture must: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Measure a **single logical operation** per benchmark method. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Avoid I/O, networking, disk access, logging, or side effects. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Avoid expensive setup inside `[Benchmark]` methods. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Use deterministic data (e.g., seeded RNG or predefined constants). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Use `[GlobalSetup]` to allocate buffers, random payloads, or reusable test data only once. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Avoid shared mutable state unless reset per iteration. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+51
to
+78
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix list indentation to satisfy markdownlint (MD005/MD007). Several list items have inconsistent indentation. Normalize bullets to a single top-level list (no leading spaces) to keep lint green. ✏️ Proposed indentation fix-Optional but strongly recommended where meaningful:
-
-* `[Params(...)]` — define small, medium, large input sizes.
-* `[GlobalSetup]` — deterministic initialization of benchmark data.
-* `[Benchmark(Description = "...")]` — always add descriptions.
-* `[Benchmark(Baseline = true)]` — when comparing two implementations.
+Optional but strongly recommended where meaningful:
+
+- `[Params(...)]` — define small, medium, large input sizes.
+- `[GlobalSetup]` — deterministic initialization of benchmark data.
+- `[Benchmark(Description = "...")]` — always add descriptions.
+- `[Benchmark(Baseline = true)]` — when comparing two implementations.-A benchmark fixture must:
-
-* Measure a **single logical operation** per benchmark method.
-* Avoid I/O, networking, disk access, logging, or side effects.
-* Avoid expensive setup inside `[Benchmark]` methods.
-* Use deterministic data (e.g., seeded RNG or predefined constants).
-* Use `[GlobalSetup]` to allocate buffers, random payloads, or reusable test data only once.
-* Avoid shared mutable state unless reset per iteration.
+A benchmark fixture must:
+
+- Measure a **single logical operation** per benchmark method.
+- Avoid I/O, networking, disk access, logging, or side effects.
+- Avoid expensive setup inside `[Benchmark]` methods.
+- Use deterministic data (e.g., seeded RNG or predefined constants).
+- Use `[GlobalSetup]` to allocate buffers, random payloads, or reusable test data only once.
+- Avoid shared mutable state unless reset per iteration.📝 Committable suggestion
Suggested change
🧰 Tools🪛 markdownlint-cli2 (0.18.1)52-52: Unordered list indentation (MD007, ul-indent) 66-66: Unordered list indentation (MD007, ul-indent) 71-71: Inconsistent indentation for list items at the same level (MD005, list-indent) 71-71: Unordered list indentation (MD007, ul-indent) 72-72: Inconsistent indentation for list items at the same level (MD005, list-indent) 72-72: Unordered list indentation (MD007, ul-indent) 73-73: Inconsistent indentation for list items at the same level (MD005, list-indent) 73-73: Unordered list indentation (MD007, ul-indent) 74-74: Inconsistent indentation for list items at the same level (MD005, list-indent) 74-74: Unordered list indentation (MD007, ul-indent) 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Use representative input sizes such as: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```csharp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Params(8, 256, 4096)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public int Count { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BenchmarkDotNet will run each benchmark for each parameter value. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 4. Method Naming Conventions | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Use descriptive names that communicate intent: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `Parse_Short` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `Parse_Long` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `ComputeHash_Small` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `ComputeHash_Large` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `Serialize_Optimized` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * `Serialize_Baseline` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| When comparing approaches, always list them clearly and tag one as the baseline. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 5. Example Benchmark Fixture | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ```csharp | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using BenchmarkDotNet.Attributes; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| using BenchmarkDotNet.Configs; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| namespace YourProject | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [MemoryDiagnoser] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [GroupBenchmarksBy(BenchmarkLogicalGroupRule.ByCategory)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public class SampleOperationBenchmark | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Params(8, 256, 4096)] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public int Count { get; set; } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| private byte[] _payload; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [GlobalSetup] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public void Setup() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| _payload = new byte[Count]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // deterministic initialization | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Benchmark(Baseline = true, Description = "Operation - baseline")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public int Operation_Baseline() => SampleOperation.Process(_payload); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| [Benchmark(Description = "Operation - optimized")] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| public int Operation_Optimized() => SampleOperation.ProcessOptimized(_payload); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 6. Reporting and CI | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Benchmark projects live exclusively under `tuning/`. They must not affect production builds. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Heavy BenchmarkDotNet runs should *not* run in CI unless explicitly configured. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Reports are produced by the benchmark runner and stored under the configured artifacts directory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## 7. Additional Guidelines | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Keep benchmark fixtures focused and readable. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Document non-obvious reasoning in short comments. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Prefer realistic but deterministic data sets. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * When benchmarks reveal regressions or improvements, reference the associated PR or issue in a comment. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Shared benchmark helpers belong in `tuning/` projects, not in production code. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| --- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ## Final Notes | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Benchmarks are performance tests, not unit tests. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Use `[Benchmark]` only for pure performance measurement. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Avoid `MethodImplOptions.NoInlining` unless absolutely necessary. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| * Use small sets of meaningful benchmark scenarios — avoid combinatorial explosion. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| <Solution> | ||
| <Folder Name="/src/"> | ||
| <Project Path="src/Codebelt.SharedKernel/Codebelt.SharedKernel.csproj" /> | ||
| </Folder> | ||
| <Folder Name="/test/"> | ||
| <Project Path="test/Codebelt.SharedKernel.Tests/Codebelt.SharedKernel.Tests.csproj" /> | ||
| </Folder> | ||
| </Solution> |
Uh oh!
There was an error while loading. Please reload this page.