KEFCore: performance benchmarks
Note
This page is auto-generated by test/analyze-test-results/generate_perf_docs.py from the latest scheduled CI benchmark run. Do not edit it by hand — changes will be overwritten on the next run. See Performance tips for configuration guidance instead.
Generated: 2026-08-07T17:33:54.861250+00:00
Source run: https://github.com/masesgroup/KEFCore/actions/runs/31201973409
At a glance
| Project | Framework | Cache | Median iteration time (ms) |
|---|---|---|---|
| Benchmark | net10.0 | non-cached | 120.906 |
| Benchmark | net10.0 | cached | 25.114 |
| Benchmark | net8.0 | non-cached | 133.992 |
| Benchmark | net8.0 | cached | 20.765 |
| Benchmark | net9.0 | non-cached | 126.087 |
| Benchmark | net9.0 | cached | 21.692 |
| Complex | net10.0 | non-cached | 251.687 |
| Complex | net10.0 | cached | 236.006 |
| Complex | net8.0 | non-cached | 245.823 |
| Complex | net8.0 | cached | 244.107 |
| Complex | net9.0 | non-cached | 232.232 |
| Complex | net9.0 | cached | 250.915 |
Full breakdown
The complete per-test results, produced by analyze_results.py:
Failures
None. All reported outcomes had success: true.
Summary by test
Framework is the .NET runtime the test ran under (e.g. net9.0), which corresponds directly to the EF Core major version under test. Cache bucket is derived from forwardCacheTimeout: cached means TTL > 0 (see KEFCoreCachedValueBufferStore.IsEnabled), non-cached covers zero/negative TTL (the default in test configs, e.g. -1 seconds).
| Project | Framework | Test | Cache | N | Mean (ms) | Median (ms) | Min (ms) | Max (ms) | Stdev (ms) | Success rate |
|---|---|---|---|---|---|---|---|---|---|---|
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==1) [cold] | non-cached | 72 | 0.179 | 0.168 | 0.116 | 0.301 | 0.043 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==1) [cold] | cached | 72 | 0.091 | 0.092 | 0.054 | 0.113 | 0.012 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==1) [warm] | non-cached | 72 | 0.068 | 0.072 | 0.027 | 0.098 | 0.017 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==1) [warm] | cached | 72 | 0.046 | 0.043 | 0.020 | 0.065 | 0.011 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | non-cached | 72 | 0.104 | 0.108 | 0.049 | 0.150 | 0.027 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | cached | 72 | 0.096 | 0.096 | 0.059 | 0.124 | 0.013 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | non-cached | 72 | 0.072 | 0.080 | 0.021 | 0.112 | 0.025 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | cached | 72 | 0.071 | 0.070 | 0.030 | 0.090 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | non-cached | 72 | 0.085 | 0.091 | 0.036 | 0.119 | 0.023 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | cached | 72 | 0.067 | 0.066 | 0.034 | 0.089 | 0.013 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(range).Count() [cold] | non-cached | 72 | 10.369 | 9.653 | 4.715 | 18.849 | 3.109 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(range).Count() [cold] | cached | 72 | 0.182 | 0.184 | 0.102 | 0.214 | 0.025 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(range).Count() [warm] | non-cached | 72 | 10.297 | 9.792 | 4.751 | 18.944 | 3.153 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(range).Count() [warm] | cached | 72 | 0.180 | 0.182 | 0.103 | 0.209 | 0.025 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | IterationTotal (sum of all queries above, not comparable to them individually) | non-cached | 72 | 124.149 | 120.906 | 76.067 | 200.100 | 28.307 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | IterationTotal (sum of all queries above, not comparable to them individually) | cached | 72 | 24.894 | 25.114 | 15.758 | 28.949 | 2.651 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Join Blogs/Posts on BlogId | non-cached | 72 | 0.061 | 0.059 | 0.039 | 0.104 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Join Blogs/Posts on BlogId | cached | 72 | 0.039 | 0.038 | 0.022 | 0.055 | 0.007 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Join Blogs/Posts where Rating>=100 | non-cached | 72 | 0.059 | 0.060 | 0.034 | 0.086 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Join Blogs/Posts where Rating>=100 | cached | 72 | 0.065 | 0.062 | 0.043 | 0.111 | 0.020 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==2) [cold] | non-cached | 72 | 13.658 | 12.602 | 6.423 | 23.722 | 3.885 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==2) [cold] | cached | 72 | 1.905 | 1.917 | 1.152 | 2.643 | 0.319 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==2) [warm] | non-cached | 72 | 11.070 | 10.494 | 5.046 | 21.795 | 3.467 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==2) [warm] | cached | 72 | 0.153 | 0.156 | 0.100 | 0.178 | 0.017 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | non-cached | 72 | 10.870 | 10.215 | 5.002 | 20.928 | 3.255 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | cached | 72 | 0.220 | 0.224 | 0.139 | 0.270 | 0.026 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Posts.All(true) | non-cached | 72 | 10.906 | 10.424 | 5.004 | 21.350 | 3.276 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Posts.All(true) | cached | 72 | 0.136 | 0.139 | 0.082 | 0.159 | 0.017 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==1) [cold] | non-cached | 72 | 0.230 | 0.218 | 0.128 | 0.418 | 0.068 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==1) [cold] | cached | 72 | 0.086 | 0.086 | 0.062 | 0.112 | 0.012 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==1) [warm] | non-cached | 72 | 0.082 | 0.083 | 0.036 | 0.124 | 0.023 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==1) [warm] | cached | 72 | 0.048 | 0.052 | 0.027 | 0.065 | 0.013 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | non-cached | 72 | 0.125 | 0.134 | 0.050 | 0.168 | 0.032 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | cached | 72 | 0.094 | 0.095 | 0.065 | 0.117 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | non-cached | 72 | 0.087 | 0.092 | 0.025 | 0.131 | 0.028 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | cached | 72 | 0.073 | 0.077 | 0.038 | 0.097 | 0.018 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | non-cached | 72 | 0.097 | 0.100 | 0.037 | 0.140 | 0.026 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | cached | 72 | 0.067 | 0.070 | 0.044 | 0.088 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(range).Count() [cold] | non-cached | 72 | 11.284 | 10.973 | 4.704 | 20.835 | 3.636 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(range).Count() [cold] | cached | 72 | 0.178 | 0.183 | 0.123 | 0.211 | 0.021 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(range).Count() [warm] | non-cached | 72 | 11.182 | 10.687 | 4.773 | 20.437 | 3.564 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(range).Count() [warm] | cached | 72 | 0.179 | 0.182 | 0.128 | 0.209 | 0.021 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | IterationTotal (sum of all queries above, not comparable to them individually) | non-cached | 72 | 136.569 | 133.992 | 73.802 | 222.913 | 34.681 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | IterationTotal (sum of all queries above, not comparable to them individually) | cached | 72 | 20.645 | 20.765 | 16.402 | 24.109 | 1.721 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Join Blogs/Posts on BlogId | non-cached | 72 | 0.074 | 0.072 | 0.041 | 0.129 | 0.020 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Join Blogs/Posts on BlogId | cached | 72 | 0.040 | 0.040 | 0.028 | 0.052 | 0.006 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Join Blogs/Posts where Rating>=100 | non-cached | 72 | 0.074 | 0.073 | 0.039 | 0.112 | 0.020 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Join Blogs/Posts where Rating>=100 | cached | 72 | 0.060 | 0.058 | 0.046 | 0.097 | 0.013 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==2) [cold] | non-cached | 72 | 14.866 | 14.447 | 6.421 | 28.122 | 4.707 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==2) [cold] | cached | 72 | 1.770 | 1.754 | 1.267 | 2.412 | 0.242 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==2) [warm] | non-cached | 72 | 12.198 | 11.583 | 5.112 | 24.404 | 4.300 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==2) [warm] | cached | 72 | 0.155 | 0.159 | 0.101 | 0.186 | 0.017 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | non-cached | 72 | 12.084 | 11.667 | 5.197 | 23.222 | 4.026 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | cached | 72 | 0.233 | 0.236 | 0.182 | 0.270 | 0.019 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Posts.All(true) | non-cached | 72 | 12.155 | 11.342 | 5.094 | 22.390 | 4.119 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Posts.All(true) | cached | 72 | 0.133 | 0.134 | 0.096 | 0.160 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==1) [cold] | non-cached | 72 | 0.213 | 0.207 | 0.141 | 0.341 | 0.045 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==1) [cold] | cached | 72 | 0.088 | 0.087 | 0.054 | 0.118 | 0.016 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==1) [warm] | non-cached | 72 | 0.076 | 0.077 | 0.036 | 0.116 | 0.019 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==1) [warm] | cached | 72 | 0.046 | 0.045 | 0.019 | 0.065 | 0.012 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | non-cached | 72 | 0.118 | 0.116 | 0.058 | 0.162 | 0.023 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | cached | 72 | 0.093 | 0.094 | 0.055 | 0.128 | 0.017 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | non-cached | 72 | 0.081 | 0.084 | 0.030 | 0.117 | 0.023 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | cached | 72 | 0.070 | 0.078 | 0.031 | 0.095 | 0.016 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | non-cached | 72 | 0.092 | 0.094 | 0.045 | 0.132 | 0.022 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | cached | 72 | 0.068 | 0.069 | 0.036 | 0.092 | 0.015 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(range).Count() [cold] | non-cached | 72 | 10.833 | 10.221 | 6.731 | 19.826 | 3.054 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(range).Count() [cold] | cached | 72 | 0.178 | 0.181 | 0.108 | 0.211 | 0.025 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(range).Count() [warm] | non-cached | 72 | 10.848 | 10.053 | 6.640 | 19.455 | 3.147 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(range).Count() [warm] | cached | 72 | 0.177 | 0.182 | 0.107 | 0.207 | 0.024 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | IterationTotal (sum of all queries above, not comparable to them individually) | non-cached | 72 | 129.419 | 126.087 | 86.581 | 209.999 | 29.739 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | IterationTotal (sum of all queries above, not comparable to them individually) | cached | 72 | 21.309 | 21.692 | 13.872 | 24.521 | 2.441 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Join Blogs/Posts on BlogId | non-cached | 72 | 0.070 | 0.070 | 0.046 | 0.121 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Join Blogs/Posts on BlogId | cached | 72 | 0.042 | 0.041 | 0.022 | 0.060 | 0.009 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Join Blogs/Posts where Rating>=100 | non-cached | 72 | 0.072 | 0.076 | 0.044 | 0.095 | 0.014 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Join Blogs/Posts where Rating>=100 | cached | 72 | 0.069 | 0.062 | 0.045 | 0.107 | 0.018 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==2) [cold] | non-cached | 72 | 14.375 | 13.622 | 9.234 | 24.204 | 3.820 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==2) [cold] | cached | 72 | 1.920 | 1.943 | 1.246 | 2.654 | 0.303 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==2) [warm] | non-cached | 72 | 11.599 | 10.713 | 6.994 | 22.549 | 3.527 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==2) [warm] | cached | 72 | 0.143 | 0.144 | 0.095 | 0.174 | 0.017 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | non-cached | 72 | 11.650 | 10.871 | 7.015 | 21.779 | 3.464 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | cached | 72 | 0.225 | 0.227 | 0.153 | 0.264 | 0.026 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Posts.All(true) | non-cached | 72 | 11.725 | 10.771 | 6.996 | 21.034 | 3.532 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Posts.All(true) | cached | 72 | 0.135 | 0.137 | 0.082 | 0.157 | 0.018 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | DataLoad | non-cached | 12 | 6401.523 | 6470.254 | 5782.213 | 6720.191 | 275.954 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | DataLoad | cached | 12 | 6432.000 | 6448.061 | 5811.594 | 6822.498 | 233.244 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | IterationTotal (sum of the two projection queries measured this run) | non-cached | 24 | 241.904 | 251.687 | 159.327 | 317.550 | 45.864 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | IterationTotal (sum of the two projection queries measured this run) | cached | 24 | 240.619 | 236.006 | 150.943 | 329.866 | 45.637 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | LocalStoreSynchronized | non-cached | 12 | 2410.746 | 2149.479 | 564.131 | 3238.333 | 774.353 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | LocalStoreSynchronized | cached | 12 | 2446.648 | 2140.281 | 1072.083 | 3140.346 | 666.186 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | NestedComplexTypeProjection_BlogId10_TaxCode | non-cached | 24 | 241.608 | 251.416 | 158.936 | 317.277 | 45.879 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | NestedComplexTypeProjection_BlogId10_TaxCode | cached | 24 | 240.287 | 235.683 | 150.563 | 329.565 | 45.646 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | SaveChanges | non-cached | 12 | 7102.411 | 7148.624 | 5817.612 | 8512.706 | 1011.361 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | SaveChanges | cached | 12 | 7193.694 | 7064.717 | 5791.619 | 8294.104 | 733.211 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | ScalarOnlyProjection_BlogId10_Url | non-cached | 24 | 0.274 | 0.271 | 0.210 | 0.348 | 0.044 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | ScalarOnlyProjection_BlogId10_Url | cached | 24 | 0.302 | 0.291 | 0.225 | 0.388 | 0.052 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | DataLoad | non-cached | 12 | 6168.861 | 6139.228 | 5936.776 | 6830.171 | 235.499 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | DataLoad | cached | 12 | 6059.959 | 6062.635 | 5558.720 | 6347.117 | 211.847 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | IterationTotal (sum of the two projection queries measured this run) | non-cached | 24 | 267.069 | 245.823 | 177.464 | 359.888 | 59.263 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | IterationTotal (sum of the two projection queries measured this run) | cached | 24 | 276.096 | 244.107 | 211.800 | 387.483 | 55.217 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | LocalStoreSynchronized | non-cached | 12 | 2271.202 | 2106.139 | 1073.523 | 3173.113 | 734.015 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | LocalStoreSynchronized | cached | 12 | 2453.435 | 2143.357 | 2078.818 | 3130.262 | 490.887 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | NestedComplexTypeProjection_BlogId10_TaxCode | non-cached | 24 | 266.699 | 245.553 | 177.086 | 359.606 | 59.284 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | NestedComplexTypeProjection_BlogId10_TaxCode | cached | 24 | 275.738 | 243.824 | 211.319 | 387.238 | 55.235 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | SaveChanges | non-cached | 12 | 6963.874 | 6874.714 | 5675.771 | 8783.737 | 771.333 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | SaveChanges | cached | 12 | 7220.814 | 7159.030 | 6345.806 | 8879.178 | 687.543 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | ScalarOnlyProjection_BlogId10_Url | non-cached | 24 | 0.334 | 0.335 | 0.250 | 0.448 | 0.051 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | ScalarOnlyProjection_BlogId10_Url | cached | 24 | 0.324 | 0.318 | 0.258 | 0.382 | 0.040 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | DataLoad | non-cached | 12 | 6085.177 | 6136.521 | 5663.994 | 6307.692 | 199.453 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | DataLoad | cached | 12 | 6168.807 | 6151.565 | 5895.888 | 6454.755 | 218.871 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | IterationTotal (sum of the two projection queries measured this run) | non-cached | 24 | 256.978 | 232.232 | 208.572 | 357.661 | 47.070 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | IterationTotal (sum of the two projection queries measured this run) | cached | 24 | 258.652 | 250.915 | 196.244 | 344.079 | 46.371 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | LocalStoreSynchronized | non-cached | 12 | 2274.756 | 2110.879 | 1073.018 | 3132.601 | 585.691 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | LocalStoreSynchronized | cached | 12 | 2378.020 | 2118.036 | 1118.227 | 3182.325 | 753.262 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | NestedComplexTypeProjection_BlogId10_TaxCode | non-cached | 24 | 256.633 | 231.930 | 208.056 | 357.388 | 47.104 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | NestedComplexTypeProjection_BlogId10_TaxCode | cached | 24 | 258.280 | 250.526 | 195.904 | 343.803 | 46.382 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | SaveChanges | non-cached | 12 | 6957.694 | 6893.901 | 5973.211 | 8617.785 | 797.779 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | SaveChanges | cached | 12 | 7319.143 | 7338.350 | 6313.520 | 8407.787 | 632.275 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | ScalarOnlyProjection_BlogId10_Url | non-cached | 24 | 0.308 | 0.305 | 0.244 | 0.381 | 0.040 | 100% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | ScalarOnlyProjection_BlogId10_Url | cached | 24 | 0.318 | 0.321 | 0.259 | 0.379 | 0.039 | 100% |
Cached vs non-cached delta
Positive delta % means the cached run was slower than the non-cached run for that same test (higher median), computed separately per framework so a difference in EF Core version behavior isn't hidden by averaging across them. For a test whose non-cached path benefits from projection push-down, a consistently positive delta here is expected — projection is intentionally skipped when the per-entity cache is enabled (TTL > 0), so timings should tend back towards the full-entity-fetch cost in that case.
| Project | Framework | Test | Non-cached median (ms) | Cached median (ms) | Delta % |
|---|---|---|---|---|---|
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==1) [cold] | 0.168 | 0.092 | -44.9% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==1) [warm] | 0.072 | 0.043 | -40.2% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | 0.108 | 0.096 | -10.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | 0.080 | 0.070 | -12.1% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | 0.091 | 0.066 | -27.4% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(range).Count() [cold] | 9.653 | 0.184 | -98.1% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Blogs.Where(range).Count() [warm] | 9.792 | 0.182 | -98.1% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | IterationTotal (sum of all queries above, not comparable to them individually) | 120.906 | 25.114 | -79.2% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Join Blogs/Posts on BlogId | 0.059 | 0.038 | -35.5% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Join Blogs/Posts where Rating>=100 | 0.060 | 0.062 | +3.2% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==2) [cold] | 12.602 | 1.917 | -84.8% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==2) [warm] | 10.494 | 0.156 | -98.5% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | 10.215 | 0.224 | -97.8% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net10.0 | Posts.All(true) | 10.424 | 0.139 | -98.7% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==1) [cold] | 0.218 | 0.086 | -60.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==1) [warm] | 0.083 | 0.052 | -37.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | 0.134 | 0.095 | -29.4% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | 0.092 | 0.077 | -16.5% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | 0.100 | 0.070 | -29.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(range).Count() [cold] | 10.973 | 0.183 | -98.3% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Blogs.Where(range).Count() [warm] | 10.687 | 0.182 | -98.3% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | IterationTotal (sum of all queries above, not comparable to them individually) | 133.992 | 20.765 | -84.5% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Join Blogs/Posts on BlogId | 0.072 | 0.040 | -45.2% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Join Blogs/Posts where Rating>=100 | 0.073 | 0.058 | -20.3% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==2) [cold] | 14.447 | 1.754 | -87.9% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==2) [warm] | 11.583 | 0.159 | -98.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | 11.667 | 0.236 | -98.0% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net8.0 | Posts.All(true) | 11.342 | 0.134 | -98.8% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==1) [cold] | 0.207 | 0.087 | -58.0% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==1) [warm] | 0.077 | 0.045 | -41.0% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | 0.116 | 0.094 | -18.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | 0.084 | 0.078 | -7.0% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | 0.094 | 0.069 | -26.7% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(range).Count() [cold] | 10.221 | 0.181 | -98.2% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Blogs.Where(range).Count() [warm] | 10.053 | 0.182 | -98.2% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | IterationTotal (sum of all queries above, not comparable to them individually) | 126.087 | 21.692 | -82.8% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Join Blogs/Posts on BlogId | 0.070 | 0.041 | -41.6% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Join Blogs/Posts where Rating>=100 | 0.076 | 0.062 | -17.5% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==2) [cold] | 13.622 | 1.943 | -85.7% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==2) [warm] | 10.713 | 0.144 | -98.7% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Post.SingleOrDefault(BlogId==NumberOfElements-1) | 10.871 | 0.227 | -97.9% |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | net9.0 | Posts.All(true) | 10.771 | 0.137 | -98.7% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | DataLoad | 6470.254 | 6448.061 | -0.3% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | IterationTotal (sum of the two projection queries measured this run) | 251.687 | 236.006 | -6.2% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | LocalStoreSynchronized | 2149.479 | 2140.281 | -0.4% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | NestedComplexTypeProjection_BlogId10_TaxCode | 251.416 | 235.683 | -6.3% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | SaveChanges | 7148.624 | 7064.717 | -1.2% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net10.0 | ScalarOnlyProjection_BlogId10_Url | 0.271 | 0.291 | +7.2% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | DataLoad | 6139.228 | 6062.635 | -1.2% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | IterationTotal (sum of the two projection queries measured this run) | 245.823 | 244.107 | -0.7% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | LocalStoreSynchronized | 2106.139 | 2143.357 | +1.8% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | NestedComplexTypeProjection_BlogId10_TaxCode | 245.553 | 243.824 | -0.7% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | SaveChanges | 6874.714 | 7159.030 | +4.1% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net8.0 | ScalarOnlyProjection_BlogId10_Url | 0.335 | 0.318 | -4.8% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | DataLoad | 6136.521 | 6151.565 | +0.2% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | IterationTotal (sum of the two projection queries measured this run) | 232.232 | 250.915 | +8.0% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | LocalStoreSynchronized | 2110.879 | 2118.036 | +0.3% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | NestedComplexTypeProjection_BlogId10_TaxCode | 231.930 | 250.526 | +8.0% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | SaveChanges | 6893.901 | 7338.350 | +6.4% |
| MASES.EntityFrameworkCore.KNet.Test.Complex | net9.0 | ScalarOnlyProjection_BlogId10_Url | 0.305 | 0.321 | +5.0% |
Cross-framework comparison
For the same project/test/cache-bucket, how the median elapsed time compares across the .NET/EF Core versions the CI matrix runs against. Only shown for combinations with data from more than one framework.
| Project | Test | Cache | net10.0 median (ms) | net8.0 median (ms) | net9.0 median (ms) |
|---|---|---|---|---|---|
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==1) [cold] | non-cached | 0.168 | 0.218 | 0.207 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==1) [cold] | cached | 0.092 | 0.086 | 0.087 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==1) [warm] | non-cached | 0.072 | 0.083 | 0.077 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==1) [warm] | cached | 0.043 | 0.052 | 0.045 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | non-cached | 0.108 | 0.134 | 0.116 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [cold] | cached | 0.096 | 0.095 | 0.094 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | non-cached | 0.080 | 0.092 | 0.084 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blog.SingleOrDefault(BlogId==NumberOfElements-1) [warm] | cached | 0.070 | 0.077 | 0.078 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | non-cached | 0.091 | 0.100 | 0.094 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blogs.Where(BlogId==1).Select(Url) [scalar projection] | cached | 0.066 | 0.070 | 0.069 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blogs.Where(range).Count() [cold] | non-cached | 9.653 | 10.973 | 10.221 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blogs.Where(range).Count() [cold] | cached | 0.184 | 0.183 | 0.181 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blogs.Where(range).Count() [warm] | non-cached | 9.792 | 10.687 | 10.053 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Blogs.Where(range).Count() [warm] | cached | 0.182 | 0.182 | 0.182 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | IterationTotal (sum of all queries above, not comparable to them individually) | non-cached | 120.906 | 133.992 | 126.087 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | IterationTotal (sum of all queries above, not comparable to them individually) | cached | 25.114 | 20.765 | 21.692 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Join Blogs/Posts on BlogId | non-cached | 0.059 | 0.072 | 0.070 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Join Blogs/Posts on BlogId | cached | 0.038 | 0.040 | 0.041 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Join Blogs/Posts where Rating>=100 | non-cached | 0.060 | 0.073 | 0.076 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Join Blogs/Posts where Rating>=100 | cached | 0.062 | 0.058 | 0.062 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Post.SingleOrDefault(BlogId==2) [cold] | non-cached | 12.602 | 14.447 | 13.622 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Post.SingleOrDefault(BlogId==2) [cold] | cached | 1.917 | 1.754 | 1.943 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Post.SingleOrDefault(BlogId==2) [warm] | non-cached | 10.494 | 11.583 | 10.713 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Post.SingleOrDefault(BlogId==2) [warm] | cached | 0.156 | 0.159 | 0.144 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Post.SingleOrDefault(BlogId==NumberOfElements-1) | non-cached | 10.215 | 11.667 | 10.871 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Post.SingleOrDefault(BlogId==NumberOfElements-1) | cached | 0.224 | 0.236 | 0.227 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Posts.All(true) | non-cached | 10.424 | 11.342 | 10.771 |
| MASES.EntityFrameworkCore.KNet.Test.Benchmark | Posts.All(true) | cached | 0.139 | 0.134 | 0.137 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | DataLoad | non-cached | 6470.254 | 6139.228 | 6136.521 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | DataLoad | cached | 6448.061 | 6062.635 | 6151.565 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | IterationTotal (sum of the two projection queries measured this run) | non-cached | 251.687 | 245.823 | 232.232 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | IterationTotal (sum of the two projection queries measured this run) | cached | 236.006 | 244.107 | 250.915 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | LocalStoreSynchronized | non-cached | 2149.479 | 2106.139 | 2110.879 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | LocalStoreSynchronized | cached | 2140.281 | 2143.357 | 2118.036 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | NestedComplexTypeProjection_BlogId10_TaxCode | non-cached | 251.416 | 245.553 | 231.930 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | NestedComplexTypeProjection_BlogId10_TaxCode | cached | 235.683 | 243.824 | 250.526 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | SaveChanges | non-cached | 7148.624 | 6874.714 | 6893.901 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | SaveChanges | cached | 7064.717 | 7159.030 | 7338.350 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | ScalarOnlyProjection_BlogId10_Url | non-cached | 0.271 | 0.335 | 0.305 |
| MASES.EntityFrameworkCore.KNet.Test.Complex | ScalarOnlyProjection_BlogId10_Url | cached | 0.291 | 0.318 | 0.321 |