BenchmarkDotNet v0.15.4, Windows 10 (10.0.19045.6332/22H2/2022Update)
AMD Ryzen 9 3900X 3.79GHz, 1 CPU, 24 logical and 12 physical cores
.NET SDK 9.0.110
[Host] : .NET 9.0.9 (9.0.9, 9.0.925.41916), X64 RyuJIT x86-64-v3
LongRun : .NET 9.0.9 (9.0.9, 9.0.925.41916), X64 RyuJIT x86-64-v3
Job=LongRun EvaluateOverhead=False Concurrent=True
Server=True InvocationCount=1 IterationCount=10
LaunchCount=3 RunStrategy=Monitoring UnrollFactor=1
WarmupCount=3
Note
Akka.Persistence.Azure
benchmark was run using Azurite emulator and not an actual Azure Storage, these benchmark results does not represent actual real world performance numbers.
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | NA | NA | NA | |
PersistAsync | 1 | NA | NA | NA | |
Persist | 100 | 1.008 ms | 0.2551 ms | 0.3818 ms | 991.91 |
PersistAsync | 100 | 1.032 ms | 0.2684 ms | 0.4018 ms | 968.57 |
Note: Benchmarks with issues for BatchSize=1
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 2,718.9 μs | 142.66 μs | 213.53 μs | 367.80 |
PersistAsync | 1 | 2,685.5 μs | 111.16 μs | 166.38 μs | 372.37 |
Persist | 100 | 277.2 μs | 25.16 μs | 37.66 μs | 3,607.36 |
PersistAsync | 100 | 283.8 μs | 40.57 μs | 60.73 μs | 3,523.35 |
Method | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|
RecoveryBenchmarkMethod | 30.85 μs | 2.768 μs | 4.143 μs | 32,417.54 |
Method | BatchSize | Mean | Error | StdDev | Median | msg/sec |
---|---|---|---|---|---|---|
Persist | 1 | 76.60 μs | 10.226 μs | 15.307 μs | 73.260 μs | 13,054.79 |
PersistAsync | 1 | 76.47 μs | 6.315 μs | 9.451 μs | 73.763 μs | 13,077.38 |
Persist | 100 | 12.73 μs | 4.833 μs | 7.233 μs | 9.040 μs | 78,582.94 |
PersistAsync | 100 | 11.74 μs | 4.216 μs | 6.310 μs | 8.960 μs | 85,179.51 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 396.07 μs | 60.553 μs | 90.632 μs | 2,524.80 |
PersistAsync | 1 | 384.12 μs | 55.282 μs | 82.743 μs | 2,603.38 |
Persist | 100 | 48.56 μs | 2.322 μs | 3.476 μs | 20,591.09 |
PersistAsync | 100 | 48.24 μs | 2.071 μs | 3.099 μs | 20,730.80 |
Method | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|
RecoveryBenchmarkMethod | 30.76 μs | 1.420 μs | 2.126 μs | 32,511.04 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 248.14 μs | 15.827 μs | 23.688 μs | 4,030.00 |
PersistAsync | 1 | 248.91 μs | 16.294 μs | 24.388 μs | 4,017.59 |
Persist | 100 | 22.24 μs | 4.922 μs | 7.367 μs | 44,969.43 |
PersistAsync | 100 | 21.50 μs | 3.884 μs | 5.813 μs | 46,521.44 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 1,127.35 μs | 50.388 μs | 75.42 μs | 887.04 |
PersistAsync | 1 | 1,108.13 μs | 43.096 μs | 64.50 μs | 902.42 |
Persist | 100 | 46.10 μs | 7.517 μs | 11.25 μs | 21,693.92 |
PersistAsync | 100 | 54.10 μs | 8.196 μs | 12.27 μs | 18,485.15 |
Method | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|
RecoveryBenchmarkMethod | 15.81 μs | 1.586 μs | 2.373 μs | 63,246.99 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 68.245 μs | 4.1685 μs | 6.2393 μs | 14,653.11 |
PersistAsync | 1 | 66.768 μs | 4.1736 μs | 6.2469 μs | 14,977.15 |
Persist | 100 | 6.114 μs | 0.8959 μs | 1.3410 μs | 163,571.66 |
PersistAsync | 100 | 5.844 μs | 0.5898 μs | 0.8828 μs | 171,128.92 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 546.84 μs | 22.830 μs | 34.170 μs | 1,828.68 |
PersistAsync | 1 | 565.79 μs | 33.090 μs | 49.527 μs | 1,767.45 |
Persist | 100 | 17.32 μs | 1.677 μs | 2.511 μs | 57,751.15 |
PersistAsync | 100 | 16.84 μs | 2.027 μs | 3.034 μs | 59,394.70 |
Method | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|
RecoveryBenchmarkMethod | 10.36 μs | 0.564 μs | 0.845 μs | 96,570.90 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 977.86 μs | 41.547 μs | 62.186 μs | 1,022.64 |
PersistAsync | 1 | 977.57 μs | 41.637 μs | 62.320 μs | 1,022.94 |
Persist | 100 | 73.32 μs | 5.269 μs | 7.886 μs | 13,638.03 |
PersistAsync | 100 | 72.80 μs | 4.537 μs | 6.790 μs | 13,736.47 |
Method | BatchSize | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|---|
Persist | 1 | 5,016.0 μs | 186.50 μs | 279.15 μs | 199.36 |
PersistAsync | 1 | 5,093.4 μs | 302.33 μs | 452.52 μs | 196.33 |
Persist | 100 | 141.3 μs | 17.89 μs | 26.78 μs | 7,079.37 |
PersistAsync | 100 | 139.9 μs | 18.32 μs | 27.42 μs | 7,150.51 |
Method | Mean | Error | StdDev | msg/sec |
---|---|---|---|---|
RecoveryBenchmarkMethod | 39.89 μs | 8.668 μs | 12.97 μs | 25,069.10 |
Akka.NET project build system template that provides standardized build and CI/CD configuration for all Akka.NET projects.
This repository contains our standardized build system setup that can be used across all Akka.NET projects. Here are the key components and practices we follow:
We primarily use GitHub Actions for our CI/CD pipelines, but also maintain Azure DevOps pipeline examples. You can find the configuration examples in:
.github/workflows/
- GitHub Actions pipeline examples.azuredevops/
- Azure DevOps pipeline examples
We use global.json
to pin the .NET SDK version for both CI/CD environments and local development. This ensures consistent builds across all environments and developers.
We use local .NET tools to enhance our build and documentation process. The tools are configured in .config/dotnet-tools.json
and include:
- Incrementalist (v1.0.0-beta4) - Used for determining which projects need to be rebuilt based on Git changes
- DocFx (v2.78.3) - Used for generating documentation
To restore these tools in your local environment, run:
dotnet tool restore
This command is automatically executed in our CI/CD pipelines (both GitHub Actions and Azure DevOps) to ensure tools are available during builds.
We utilize two key MSBuild files for centralized configuration:
-
Directory.Packages.props
- Implements Central Package Version Management for consistent NuGet package versions across all projects in the solution. -
Directory.Build.props
- Defines common build properties, including:- Copyright and author information
- Source linking configuration
- NuGet package metadata
- Common compiler settings
- Target framework definitions
The coverlet.runsettings
file configures code coverage collection using Coverlet, with settings for:
- Multiple coverage report formats (JSON, Cobertura, LCOV, TeamCity, OpenCover)
- Test assembly exclusions
- Source linking integration
- Performance optimizations
Our release process is streamlined through:
RELEASE_NOTES.md
- Contains version history and release notesbuild.ps1
- PowerShell script that processes release notes and updates version information- Supporting scripts in
/scripts
:bumpVersion.ps1
- Updates version numbersgetReleaseNotes.ps1
- Parses release notes
The build system primarily relies on standard dotnet
CLI commands, with the PowerShell scripts mainly handling release note processing and version management.
We prefer the new .slnx
XML-based solution format over the traditional .sln
format. This requires .NET 9 SDK or later. The new format is more concise and easier to work with. You can migrate existing solutions using:
dotnet sln migrate
For more information about the new .slnx
format, see the official announcement.
- Ensure you have the correct .NET SDK version installed (check
global.json
) - Clone this repository
- Run
dotnet build
to verify the build system - Customize the configuration files for your specific project needs