Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
e984264
Implement async serialization based on loopback TCP streams to simula…
multiarc May 4, 2024
52c1084
Fix readme (removed ZeroFormatter)
multiarc May 4, 2024
22276d2
Automatic port increment for parallel tests
multiarc May 4, 2024
58186f3
Disable parallel tests
multiarc May 4, 2024
5fc5937
Change start port to 27000
multiarc May 4, 2024
f7f9e31
Improve blackhole memory behavior, fix port selection (flaky tests)
multiarc May 5, 2024
e5aa522
Remove dead code
multiarc May 5, 2024
98ec408
Optimize and refactor async benchmarks
multiarc May 5, 2024
801bfc0
Do not force bytes out to the network until entire queue is pushed
multiarc May 5, 2024
6d1cbed
Add buffered stream wrapper as parameter
multiarc May 5, 2024
fa826ef
Fix disposing
multiarc May 5, 2024
6c29048
Do not throw exceptions after disposing
multiarc May 5, 2024
a07b825
Fix serialize buffering (i = 0)
multiarc May 5, 2024
7288846
Add job reference from command line instead of as attribute
multiarc May 6, 2024
0708b23
Add serializers unit tests
multiarc May 6, 2024
f1c6606
Reduce parameters for async queue
multiarc May 6, 2024
71fd1cf
Remove quotes
multiarc May 6, 2024
865fe6b
Remove more quotes
multiarc May 6, 2024
4bc030e
Add strategy
multiarc May 6, 2024
842a4a0
Move matrix before if
multiarc May 6, 2024
a7fe445
Move steps into strategy
multiarc May 6, 2024
508c305
Create new step to work around if with matrix
multiarc May 6, 2024
939661d
Rename target
multiarc May 6, 2024
10c8b2d
Spaces?
multiarc May 6, 2024
fd02932
matrix.value
multiarc May 6, 2024
3a97134
matrix.value
multiarc May 6, 2024
36ac819
Ternary?
multiarc May 6, 2024
86a62ba
Now this is ternary for sure...
multiarc May 6, 2024
6d33065
Remove extra job
multiarc May 6, 2024
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
108 changes: 10 additions & 98 deletions .github/workflows/dotnet.yml
Original file line numberDiff line numberDiff line change
Expand Up@@ -55,45 +55,17 @@ jobs:
run: dotnet test --no-build --verbosity normal -f net6.0
- name: Test .NET 8.0
run: dotnet test --no-build --verbosity normal -f net8.0

benchmark-windows-net48:
benchmark-windows:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
strategy:
matrix:
target: [net48, net6.0, net8.0]
benchmarkSet: [SerializersBenchmark.AsyncBenchmarks*, SerializersBenchmark.Benchmarks*]
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET Framework 4.8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net48 -- --runtimes net48 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net48
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net6:

runs-on: windows-latest
timeout-minutes: 320 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
Expand All@@ -107,75 +79,15 @@ jobs:
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 6
run: dotnet build --no-restore -f ${{matrix.target}}
- name: Execute
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net6.0 -- --runtimes net6.0 --filter *
run: dotnet run -c Release -f ${{matrix.target}} -- --job default --runtimes ${{matrix.target}} --filter ${{matrix.benchmarkSet}}
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net6
name: ${{matrix.target}}${{ matrix.benchmarkSet == 'SerializersBenchmark.AsyncBenchmarks*' && '-async' || '' }}
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

benchmark-windows-net8:

runs-on: windows-latest
timeout-minutes: 360 #6 hours
needs: build-windows
if: ${{ github.ref == 'refs/heads/main' }}

steps:
- uses: actions/checkout@v4
- name: Setup .NET 6
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Execute .NET 8
working-directory: ./SerializersBenchmark
run: dotnet run -c Release -f net8.0 -- --runtimes net8.0 --filter *
- name: Publish Results
uses: actions/upload-artifact@v4
with:
name: net8
path: ./SerializersBenchmark/BenchmarkDotNet.Artifacts/results
compression-level: 9

#TODO process results

# benchmark-linux:
#
# runs-on: ubuntu-latest
# timeout-minutes: 360
# needs: build-linux
# if: ${{ github.ref == 'refs/heads/main' }}
#
# steps:
# - uses: actions/checkout@v4
# - name: Setup .NET 6
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 6.0.x
# - name: Setup .NET 8
# uses: actions/setup-dotnet@v4
# with:
# dotnet-version: 8.0.x
# - name: Restore dependencies
# run: dotnet restore
# - name: Build .NET 6.0
# run: dotnet build --no-restore -f net6.0
# - name: Build .NET 8.0
# run: dotnet build --no-restore -f net8.0
# - name: Execute
# working-directory: ./SerializersBenchmark
# run: dotnet run -c Release -f net8.0 -- --runtimes net6.0 net8.0 --filter *

#TODO process results
1 change: 0 additions & 1 deletion README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,5 +27,4 @@ Implemented benchmarks for the following serializers:
- UTF8Json (https://github.com/neuecc/Utf8Json)

#### Legacy Serializers
- ZeroFormatter
- BinaryFormatter
167 changes: 167 additions & 0 deletions SerializerBenchmarks.UnitTests/AsyncBenchmarkTests.cs
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
using SerializersBenchmark;
using SerializersBenchmark.Models;
using SerializersBenchmark.Serializers;
using Xunit;

namespace SerializerBenchmarks.UnitTests;

public sealed class AsyncBenchmarkTests : IDisposable
{
private static int _portNumber = 27003;
private static int GetNextPort()
{
Interlocked.Increment(ref _portNumber);
return _portNumber;
}

private readonly AsyncBenchmarks _benchmark = new()
{
N = 1,
QueueLength = 7,
BlackHolePort = GetNextPort(),
WhiteHolePort = GetNextPort()
};

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task SerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedSerializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.SerializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task DeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

[Theory(Timeout = 1000)]
[InlineData(typeof(Ceras<DataItem>))]
[InlineData(typeof(Utf8JsonSerializer<DataItem>))]
[InlineData(typeof(MessagePack<DataItem>))]
[InlineData(typeof(GroBuf<DataItem>))]
[InlineData(typeof(Bois<DataItem>))]
[InlineData(typeof(BoisLz4<DataItem>))]
[InlineData(typeof(Jil<DataItem>))]
[InlineData(typeof(ProtobufNet<DataItem>))]
[InlineData(typeof(GoogleProtobuf<ProtobufDataItem>))]
[InlineData(typeof(ServiceStack<DataItem>))]
[InlineData(typeof(FastJson<DataItem>))]
[InlineData(typeof(DataContractBinaryXml<DataItem>))]
[InlineData(typeof(DataContract<DataItem>))]
[InlineData(typeof(XmlSerializer<DataItem>))]
[InlineData(typeof(NewtonsoftJson<DataItem>))]
[InlineData(typeof(MsgPackCli<DataItem>))]
[InlineData(typeof(SystemTextJson<DataItem>))]
#if (NET6_0_OR_GREATER)
[InlineData(typeof(MemoryPack<DataItem>))]
[InlineData(typeof(BinaryPack<DataItem>))]
[InlineData(typeof(SpanJson<DataItem>))]
[InlineData(typeof(SystemTextJsonSourceGen<DataItem>))]
#endif
#if NET48
[InlineData(typeof(BinaryFormatter<DataItem>))]
#endif
public async Task BufferedDeserializeAsyncTest(Type serializerType)
{
_benchmark.SerializerType = serializerType;
_benchmark.UseBuffer = true;
await _benchmark.SetupAsync();
await _benchmark.DeserializeAsync();
}

public void Dispose()
{
_benchmark.Cleanup();
}
}
Loading