Skip to content
Draft
82 changes: 82 additions & 0 deletions Benchmarks/Salar.Bois.BenchBois/BoisBenchmark_Test1_Arrays_Big.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using BenchmarkDotNet.Attributes;
using Salar.Bois.BenchmarksBase;
using Salar.Bois.BenchmarksObjects.TestObjects;
using System.IO;

namespace Salar.Bois.BenchBois;

public class BoisBenchmark_Test1_Arrays_Big : BenchmarkBase<Test1_Arrays_Big>
{
[Params("Bois")]
public override string TestName { get; set; }


[Benchmark(Description = "Serialize")]
[BenchmarkCategory("Bois")]
public override void Serialize()
{
for (int i = 0; i < IterationCount; i++)
{
Reset();
Bois_Test1_Arrays_Big.WriteCompanyModel(TestObject, TestStream);
}
}

[Benchmark(Description = "Deserialize")]
[BenchmarkCategory("Bois")]
public override void Deserialize()
{
for (int i = 0; i < IterationCount; i++)
{
Reset();
Bois_Test1_Arrays_Big.ReadCompanyModel(TestStream);
}
}
}

public class BoisBenchmark_Test1_Arrays_Small : BenchmarkBase<Test1_Arrays_Small>
{
[Params("Bois")]
public override string TestName { get; set; }


[Benchmark(Description = "Serialize")]
[BenchmarkCategory("Bois")]
public override void Serialize()
{
for (int i = 0; i < IterationCount; i++)
{
Reset();
Bois_Test1_Arrays_Small.WriteCompanyModel(TestObject, TestStream);
}
}

[Benchmark(Description = "Deserialize")]
[BenchmarkCategory("Bois")]
public override void Deserialize()
{
for (int i = 0; i < IterationCount; i++)
{
Reset();
Bois_Test1_Arrays_Small.ReadCompanyModel(TestStream);
}
}
}

public static partial class Bois_Test1_Arrays_Big
{
[BoisReader]
public static partial Test1_Arrays_Big? ReadCompanyModel(Stream source);

[BoisWriter]
public static partial void WriteCompanyModel(Test1_Arrays_Big? model, Stream output);
}

public static partial class Bois_Test1_Arrays_Small
{
[BoisReader]
public static partial Test1_Arrays_Small? ReadCompanyModel(Stream source);

[BoisWriter]
public static partial void WriteCompanyModel(Test1_Arrays_Small? model, Stream output);
}
3 changes: 3 additions & 0 deletions Benchmarks/Salar.Bois.BenchBois/Salar.Bois.BenchBois.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
<ItemGroup>
<ProjectReference Include="..\..\Salar.Bois\Salar.Bois.csproj" />
<ProjectReference Include="..\Salar.Bois.BenchmarksBase\Salar.Bois.BenchmarksBase.csproj" />
<ProjectReference Include="..\..\Salar.Bois.Generator\Salar.Bois.Generator.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
</ItemGroup>

</Project>
5 changes: 4 additions & 1 deletion Benchmarks/Salar.Bois.BenchmarksRun/BenchEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,10 @@ public IEnumerable<Type> GetBenchmarkable()
{
foreach (var benchmarkType in _benchmarks)
{
yield return benchmarkType.MakeGenericType(testObjectType);
if (benchmarkType.IsGenericType)
yield return benchmarkType.MakeGenericType(testObjectType);
else
yield return benchmarkType;
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions Benchmarks/Salar.Bois.BenchmarksRun/BenchRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ private void SetupBenchmarks()
_engine.AddBenchmark(typeof(BoisBenchmark<>));
_engine.AddBenchmark(typeof(BoisBufferBenchmark<>));
_engine.AddBenchmark(typeof(BoisLz4Benchmark<>));
_engine.AddBenchmark(typeof(BoisBenchmark_Test1_Arrays_Big));
_engine.AddBenchmark(typeof(BoisBenchmark_Test1_Arrays_Small));
_engine.AddBenchmark(typeof(MessagePackBenchmark<>));
_engine.AddBenchmark(typeof(MessagePackLz4Benchmark<>));
_engine.AddBenchmark(typeof(ProtobufNetBenchmark<>));
Expand Down
7 changes: 7 additions & 0 deletions CodeGenSample/CodeGenSample.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,11 @@
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\Salar.Bois.Generator\Salar.Bois.Generator.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
<ProjectReference Include="..\Salar.Bois\Salar.Bois.csproj" />
</ItemGroup>

</Project>
87 changes: 0 additions & 87 deletions CodeGenSample/Models/CompanyModel-generated.cs

This file was deleted.

105 changes: 23 additions & 82 deletions CodeGenSample/Models/CompanyModel.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using Salar.BinaryBuffers;
using Salar.BinaryBuffers.Compatibility;
using Salar.Bois.Generator.Attributes;
using Salar.Bois.Generator.Serializers;
using Salar.BinaryBuffers;
using Salar.Bois;
using System;
using System.Collections.Generic;
using System.Text;

namespace CodeGenSample.Models;

Expand Down Expand Up @@ -81,84 +80,26 @@ public static partial class CompanyModelBois
[BoisReader]
public static partial CompanyModel? ReadCompanyModel(Stream source);

[BoisReader]
public static partial CompanyModel? ReadCompanyModel(BufferReaderBase reader);

[BoisReader]
public static partial CompanyModel? ReadCompanyModel(BufferReaderBase reader, Encoding encoding);

[BoisReader]
public static partial CompanyModel? ReadCompanyModel(byte[] buffer, int position, int length);

[BoisWriter]
public static partial void WriteCompanyModel(Stream output, CompanyModel? model);
}
public static partial void WriteCompanyModel(CompanyModel? model, Stream output);

public static partial class CompanyModelBois
{
public static partial CompanyModel? ReadCompanyModel(Stream source)
{
BufferReaderBase reader = new StreamBufferReader(source);

// Member count, if null then the whole object is null, otherwise the member count is not used in source gen models
var memCount = BoisNumericSerializers.ReadVarUInt32Nullable(reader);
if (memCount is null)
return null;

var model = new CompanyModel();

model.Id = BoisPrimitiveReaders.ReadGuid(reader); // Id
model.Name = BoisPrimitiveReaders.ReadString(reader, System.Text.Encoding.UTF8);
model.Address = BoisPrimitiveReaders.ReadString(reader, System.Text.Encoding.UTF8);
model.Phone = BoisPrimitiveReaders.ReadString(reader, System.Text.Encoding.UTF8);
model.Founded = BoisPrimitiveReaders.ReadDateTime(reader);
model.Revenue = BoisNumericSerializers.ReadVarDecimal(reader);
model.IsActive = BoisPrimitiveReaders.ReadBoolean(reader);

// Read the list of employees
var employeesCount = BoisNumericSerializers.ReadVarUInt32Nullable(reader);
if (employeesCount is not null)
{
var employees = model.Employees;
employees.Clear();
for (int i = 0; i < employeesCount; i++)
{
var employee = BoisPrimitiveReaders.ReadString(reader, System.Text.Encoding.UTF8);
employees.Add(employee);
}
}

_ = BoisNumericSerializers.ReadVarInt32(reader); // EmployeesCount, not used in source gen models since we have the list

return model;
}
[BoisWriter]
public static partial void WriteCompanyModel(CompanyModel? model, BufferWriterBase writer);

public static partial void WriteCompanyModel(Stream output, CompanyModel? model)
{
var writer = new StreamBufferWriter(output);
if (model is null)
{
BoisPrimitiveWriters.WriteNullValue(writer);
return;
}

// Write `CompanyModel` member count (properties + fields)
BoisNumericSerializers.WriteUIntNullableMemberCount(writer, 9u);

// Write the members in the same order as they are defined in the class

BoisPrimitiveWriters.WriteValue(writer, model.Id);
BoisPrimitiveWriters.WriteValue(writer, model.Name, System.Text.Encoding.UTF8);
BoisPrimitiveWriters.WriteValue(writer, model.Address, System.Text.Encoding.UTF8);
BoisPrimitiveWriters.WriteValue(writer, model.Phone, System.Text.Encoding.UTF8);
BoisPrimitiveWriters.WriteValue(writer, model.Founded);
BoisNumericSerializers.WriteVarDecimal(writer, model.Revenue);
BoisPrimitiveWriters.WriteValue(writer, model.IsActive);

// Write the list of employees
if (model.Employees is null)
{
BoisPrimitiveWriters.WriteNullValue(writer);
}
else
{
BoisNumericSerializers.WriteUIntNullableMemberCount(writer, (uint)model.Employees.Count);
foreach (var member in model.Employees)
{
BoisPrimitiveWriters.WriteValue(writer, member, System.Text.Encoding.UTF8);
}
}
BoisNumericSerializers.WriteVarInt(writer, model.EmployeesCount);
}
}
[BoisWriter]
public static partial void WriteCompanyModel(CompanyModel? model, BufferWriterBase writer, Encoding encoding);

[BoisWriter]
public static partial void WriteCompanyModel(CompanyModel? model, byte[] output, int position, int length);


}
Loading