Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
8c53be1
Fix virtualized list item selection state
aarondglover Sep 15, 2026
71ab450
Limit select shadow items to selected values
aarondglover Sep 15, 2026
4fbee31
Keep select shadow list bounded to selection
aarondglover Sep 15, 2026
bf2cc9e
Restore select error identifier binding
aarondglover Sep 15, 2026
fad9966
Add virtualized list selection regression tests
aarondglover Sep 15, 2026
39857e4
Add select virtualization regression tests
aarondglover Sep 15, 2026
98f325e
Protect shadow list scaling behavior
aarondglover Sep 15, 2026
89d94c6
Add strict virtualization regression coverage
aarondglover Sep 15, 2026
3ee1d3e
Cover initialized single selection virtualization
aarondglover Sep 15, 2026
9651a3b
Add temporary virtualization validation workflow
aarondglover Sep 15, 2026
3209fff
Capture virtualization validation build log
aarondglover Sep 15, 2026
ebf0026
Fix select virtualization text assertions
aarondglover Sep 15, 2026
1159712
Fix strict virtualization text assertion
aarondglover Sep 15, 2026
88de005
Fix single selection virtualization text assertion
aarondglover Sep 15, 2026
635b8b0
Fix comparer virtualization test setup order
aarondglover Sep 15, 2026
397f920
Add BenchmarkDotNet benchmark project
aarondglover Sep 15, 2026
516976a
Add bUnit benchmark context
aarondglover Sep 15, 2026
9bfb160
Add select benchmark host component
aarondglover Sep 15, 2026
7b135a7
Add select initial render benchmarks
aarondglover Sep 15, 2026
533db54
Add select multiplicity benchmarks
aarondglover Sep 15, 2026
5596aa9
Add select selection density benchmarks
aarondglover Sep 15, 2026
aa40016
Add Blazor virtualization scale probe
aarondglover Sep 15, 2026
97ef12d
Add benchmark runner entry point
aarondglover Sep 15, 2026
b1b896e
Fix bUnit benchmark imports
aarondglover Sep 15, 2026
8ecf6d4
Add repeatable baseline and fixed benchmark runner
aarondglover Sep 15, 2026
970b0c8
Document virtualization benchmark methodology
aarondglover Sep 15, 2026
17e84d6
Include benchmark project in solution
aarondglover Sep 15, 2026
466a2d4
Add direct list render benchmarks
aarondglover Sep 15, 2026
d00ee13
Document direct list benchmarks
aarondglover Sep 15, 2026
f9e83af
Run all virtualization benchmark classes
aarondglover Sep 15, 2026
07067f2
Support probe-only benchmark runs
aarondglover Sep 15, 2026
01f02a4
Add temporary virtualization benchmark probe workflow
aarondglover Sep 15, 2026
bbcc176
Dispose benchmark contexts asynchronously
aarondglover Sep 15, 2026
53c8654
Dispose select multiplicity contexts asynchronously
aarondglover Sep 15, 2026
a4a48c0
Dispose selection density contexts asynchronously
aarondglover Sep 15, 2026
8097cff
Dispose list benchmark contexts asynchronously
aarondglover Sep 15, 2026
4db5888
Dispose probe contexts asynchronously
aarondglover Sep 15, 2026
bbc120d
Await probe lifecycle
aarondglover Sep 15, 2026
5c4ca1c
Preserve non-virtualized select item registry
aarondglover Sep 15, 2026
76b806e
Cover non-virtualized select item registry
aarondglover Sep 15, 2026
d2161e6
Benchmark final non-virtualized compatibility fix
aarondglover Sep 15, 2026
17249c7
Cover virtualized item-content presentation
aarondglover Sep 15, 2026
088fc6a
Cover virtualized selection changes
aarondglover Sep 15, 2026
0f5460a
Support focused benchmark runs
aarondglover Sep 15, 2026
2ae16de
Run focused BenchmarkDotNet smoke comparison
aarondglover Sep 15, 2026
4f25e5a
Use bUnit v2 rerender API
aarondglover Sep 15, 2026
b825a44
Benchmark settled select rendering
aarondglover Sep 15, 2026
1fbc3ce
test: isolate dynamic virtualized selection state from shadow renderi…
aarondglover Sep 16, 2026
deac187
fix: synchronize virtualized multiselect text after parameter selecti…
aarondglover Sep 18, 2026
c74d035
Fix virtualized shadow list refresh on selection changes
aarondglover Sep 26, 2026
2ccf246
Unsubscribe disposed select items from selection updates
aarondglover Sep 26, 2026
c05db2b
Limit shadow list re-keying to virtualized selects
aarondglover Sep 26, 2026
50785c3
Merge upstream dev into virtualization fix
aarondglover Sep 26, 2026
cf3484d
Merge PR1 into benchmark branch
aarondglover Sep 26, 2026
d318e02
Document benchmark reproducibility requirement
aarondglover Sep 26, 2026
549199d
Default benchmark fixed ref to current branch head
aarondglover Sep 26, 2026
46692bb
Document opt-in benchmark usage for CI and workstations
aarondglover Sep 26, 2026
505ecc7
Benchmark against current upstream dev baseline
aarondglover Sep 26, 2026
4b026f4
Run benchmark validation for harness PR changes
aarondglover Sep 26, 2026
464019a
Document exact upstream benchmark baseline
aarondglover Sep 26, 2026
2b29bcf
Add three-stage benchmark comparison evidence
aarondglover Sep 26, 2026
90ffe7a
Benchmark exact candidate SHA in CI
aarondglover Sep 26, 2026
ff5a6ce
Fix exact candidate checkout for benchmark CI
aarondglover Sep 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/workflows/virtualization-benchmark-probe.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Virtualization benchmark probe

on:
push:
branches:
- benchmarks/virtualized-list-selection-state
pull_request:
branches:
- dev
paths:
- 'benchmarks/**'
- '.github/workflows/virtualization-benchmark-probe.yml'
workflow_dispatch:

jobs:
probe:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x

- name: Run three-stage structural probe
shell: pwsh
run: ./benchmarks/run-virtualization-benchmarks.ps1 -ProbeOnly -BaselineRef "7b5faf7ebb7666558d13c447313e9b09c92a110d" -Stage1Ref "76b806ec54cdb43c9b5171bbbd10d4759014583f" -FixedRef "${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}" -ResultsDirectory "$env:GITHUB_WORKSPACE/benchmark-results"

- name: Upload probe results
if: always()
uses: actions/upload-artifact@v4
with:
name: virtualization-benchmark-probe
path: benchmark-results

quick-benchmark:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 10.0.x

- name: Run authoritative upstream-to-candidate BenchmarkDotNet comparison
shell: pwsh
run: ./benchmarks/run-virtualization-benchmarks.ps1 -SkipProbe -Quick -BaselineRef "7b5faf7ebb7666558d13c447313e9b09c92a110d" -FixedRef "${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}" -BenchmarkFilter "*SelectInitialRenderBenchmarks*" -ResultsDirectory "$env:GITHUB_WORKSPACE/benchmark-results"

- name: Upload BenchmarkDotNet results
if: always()
uses: actions/upload-artifact@v4
with:
name: virtualization-benchmark-quick
path: benchmark-results
41 changes: 41 additions & 0 deletions .github/workflows/virtualization-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Virtualization validation

on:
push:
branches:
- fix/virtualized-list-selection-state
workflow_dispatch:

jobs:
test:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: |
8.0.x
9.0.x
10.0.x

- name: Restore
run: dotnet restore

- name: Build
shell: bash
run: |
set -o pipefail
dotnet build --no-restore 2>&1 | tee build.log

- name: Upload build log
if: always()
uses: actions/upload-artifact@v4
with:
name: virtualization-build-log
path: build.log

- name: Test
run: dotnet test --configuration Release -f net10.0 --collect:"XPlat Code Coverage"
3 changes: 3 additions & 0 deletions CodeBeamMudExtensions.slnx
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<Solution>
<Folder Name="/benchmarks/">
<Project Path="benchmarks/CodeBeam.MudBlazor.Extensions.Benchmarks/CodeBeam.MudBlazor.Extensions.Benchmarks.csproj" />
</Folder>
<Folder Name="/docs/">
<Project Path="docs/CodeBeam.MudBlazor.Extensions.Docs.Server/CodeBeam.MudBlazor.Extensions.Docs.Server.csproj" />
<Project Path="docs/CodeBeam.MudBlazor.Extensions.Docs.Wasm/CodeBeam.MudBlazor.Extensions.Docs.Wasm.csproj" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using Bunit;
using Microsoft.Extensions.DependencyInjection;
using MudBlazor.Services;
using MudExtensions.Services;

namespace MudExtensions.Benchmarks;

internal static class BenchmarkBunitContext
{
public static BunitContext Create()
{
var context = new BunitContext();
context.JSInterop.Mode = JSRuntimeMode.Loose;
context.Services.AddMudServices(options =>
{
options.SnackbarConfiguration.ShowTransitionDuration = 0;
options.SnackbarConfiguration.HideTransitionDuration = 0;
options.PopoverOptions.CheckForPopoverProvider = false;
});
context.Services.AddMudExtensions();
return context;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<RootNamespace>MudExtensions.Benchmarks</RootNamespace>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.15.8" />
<PackageReference Include="bunit" Version="2.4.2" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\CodeBeam.MudBlazor.Extensions\CodeBeam.MudBlazor.Extensions.csproj" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using BenchmarkDotNet.Attributes;
using Bunit;

namespace MudExtensions.Benchmarks;

[MemoryDiagnoser]
[BenchmarkCategory("MudListExtended", "InitialRender")]
public class ListExtendedInitialRenderBenchmarks
{
private List<int?> _items = null!;
private int?[] _selectedValues = null!;

[Params(10, 100, 1_000, 4_000)]
public int ItemCount { get; set; }

[Params(false, true)]
public bool Virtualize { get; set; }

[GlobalSetup]
public void Setup()
{
_items = Enumerable.Range(1, ItemCount).Select(static value => (int?)value).ToList();
_selectedValues = [1, ItemCount];
}

[Benchmark]
public async Task<int> RenderList()
{
await using var context = BenchmarkBunitContext.Create();
var cut = context.Render<MudListExtended<int?>>(parameters => parameters
.Add(x => x.ItemCollection, _items)
.Add(x => x.Virtualize, Virtualize)
.Add(x => x.MultiSelection, true)
.Add(x => x.SelectedValues, _selectedValues));

return cut.RenderCount;
}
}
10 changes: 10 additions & 0 deletions benchmarks/CodeBeam.MudBlazor.Extensions.Benchmarks/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using BenchmarkDotNet.Running;
using MudExtensions.Benchmarks;

if (args.Length > 0 && string.Equals(args[0], "probe", StringComparison.OrdinalIgnoreCase))
{
return await ScaleProbe.RunAsync(args[1..]);
}

BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
return 0;
Loading
Loading