|
| 1 | +# Brief Review: Issue #161 — Drop netstandard2.0 |
| 2 | + |
| 3 | +## Verdict: Changes required before moving to ready |
| 4 | + |
| 5 | +The file list, acceptance criteria, and test strategy are solid. |
| 6 | +Three issues need resolving. |
| 7 | + |
| 8 | +--- |
| 9 | + |
| 10 | +## Issue 1 — Category `performance` is inconsistent with the brief's own analysis (blocking) |
| 11 | + |
| 12 | +The brief states: |
| 13 | + |
| 14 | +> "A micro-benchmark improvement in LeadingZeroCount that does not translate to observable improvement in RecordValue throughput is expected (the intrinsic is already used on net8.0+)." |
| 15 | +
|
| 16 | +This concedes the point: **no existing net8.0+ consumer will see any performance improvement**. |
| 17 | +The hardware intrinsic path is already taken at compile time via `#if NET5_0_OR_GREATER`. |
| 18 | +Removing the fallback does not change the compiled output for any net8.0 or net9.0 or net10.0 build. |
| 19 | + |
| 20 | +The performance gain only applied to consumers targeting the `netstandard2.0` package on a modern runtime — consumers who are now being dropped, not improved. |
| 21 | + |
| 22 | +The accurate category is `chore` (or `refactor`). |
| 23 | + |
| 24 | +**Action required — choose one:** |
| 25 | + |
| 26 | +- **Option A**: Change category to `chore`. |
| 27 | + Remove the entire "Benchmark Strategy" section (benchmarks are not required for `chore`). |
| 28 | + Retain the note that `LeadingZeroCountBenchmarkBase.cs` must be updated to remove the `ImperativeImplementation` method so it still compiles. |
| 29 | + |
| 30 | +- **Option B**: Keep category as `performance` and rewrite the performance rationale. |
| 31 | + The argument must be made without contradiction: e.g., "consumers who pinned to the `netstandard2.0` target on .NET 5+ runtimes received the slow fallback path; this change forces them onto the net8.0 target, where they receive the intrinsic." Acknowledge this is a narrow population. |
| 32 | + With `performance` retained, the benchmark plan must also be strengthened (see Issue 2). |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## Issue 2 — End-to-end benchmark is conditional when it should be mandatory (blocking if `performance` is kept) |
| 37 | + |
| 38 | +The brief says: |
| 39 | + |
| 40 | +> "If an end-to-end benchmark for `RecordValue` throughput exists (check `Recording/`), run it too." |
| 41 | +
|
| 42 | +`HdrHistogram.Benchmarking/Recording/Recording32BitBenchmark.cs` **was confirmed to exist**. |
| 43 | +The spec (`testing-standards.md`) states: "Both levels of benchmark are required." |
| 44 | +Conditional language is not acceptable for a `performance` issue. |
| 45 | + |
| 46 | +**Action required (if `performance` category is retained):** |
| 47 | + |
| 48 | +Replace the conditional phrasing with an explicit instruction: |
| 49 | + |
| 50 | +> "Run `Recording32BitBenchmark` as the end-to-end benchmark. |
| 51 | +> Include before/after results in the PR description alongside the `LeadingZeroCount` micro-benchmark results." |
| 52 | +
|
| 53 | +--- |
| 54 | + |
| 55 | +## Issue 3 — PropertyGroup consolidation scope is unresolved (minor, non-blocking) |
| 56 | + |
| 57 | +Risk item 4 notes that the three per-framework `Release` `PropertyGroup` conditions could be collapsed into one unconditional block, but says "should be confirmed with the implementer." |
| 58 | + |
| 59 | +A brief should not leave scope ambiguous. |
| 60 | +The implementer cannot resolve this themselves — it must be decided before implementation begins. |
| 61 | + |
| 62 | +**Action required:** |
| 63 | + |
| 64 | +Make an explicit decision and state it clearly, e.g.: |
| 65 | + |
| 66 | +> "Collapsing the three per-framework Release `PropertyGroup` conditions into a single `Condition="'$(Configuration)' == 'Release'"` block is **in scope** for this PR." |
| 67 | +
|
| 68 | +or: |
| 69 | + |
| 70 | +> "Collapsing the Release `PropertyGroup` conditions is **out of scope**; a follow-up chore can address it." |
| 71 | +
|
| 72 | +--- |
| 73 | + |
| 74 | +## What is correct and does not need changing |
| 75 | + |
| 76 | +- All four affected files exist at the stated paths. |
| 77 | +- Line-level descriptions of the required changes are accurate. |
| 78 | +- The claim that only two source files contain the relevant `#if` blocks is confirmed. |
| 79 | +- Unit test and benchmarking projects already target `net10.0;net9.0;net8.0` — no changes needed there. |
| 80 | +- Acceptance criteria are measurable and complete. |
| 81 | +- The note that `ImperativeImplementation` in `LeadingZeroCountBenchmarkBase.cs` must be removed is correct and necessary. |
| 82 | +- The NuGet breaking-change risk is correctly identified. |
0 commit comments