benchmarks/Benchmarks/Program.cs (26 lines of code) (raw):
// Licensed to Elasticsearch B.V under one or more agreements.
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information.
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Reports;
using BenchmarkDotNet.Running;
using Elastic.Clients.Elasticsearch;
using Elastic.Transport;
using Nest;
using System.Globalization;
using System.Text;
var config = ManualConfig.Create(DefaultConfig.Instance);
config.SummaryStyle = new SummaryStyle(CultureInfo.CurrentCulture, true, BenchmarkDotNet.Columns.SizeUnit.B, null);
config.AddDiagnoser(MemoryDiagnoser.Default);
BenchmarkRunner.Run<Benchmarks.BulkIngest>(config);
//var thing = new Benchmarks.DescriptorValues();
//thing.Setup();
//var a = new EnrichPutPolicyRequestDescriptorV2<Benchmarks.SampleData>("test");
//a.Match(new Policy { Name = "test-name" });
//var settings = new ElasticsearchClientSettings();
//var serializer = new DefaultRequestResponseSerializer(settings);
//var stream = new MemoryStream();
//serializer.Serialize(a, stream);
//stream.Position = 0;
//var sr = new StreamReader(stream);
//var result = sr.ReadToEnd();
//Console.ReadKey();
namespace Benchmarks
{
//public class DescriptorValues
//{
// private EnrichPutPolicyRequestDescriptor<SampleData>? _data1;
// private EnrichPutPolicyRequestDescriptorV2<SampleData>? _data2;
// private EnrichPutPolicyRequestDescriptorV3<SampleData>? _data3;
// private EnrichPutPolicyRequestDescriptorV4<SampleData>? _data4;
// //private Existing<SampleData>? _basicData1;
// //private NewV1<SampleData>? _basicData2;
// //private NewV2<SampleData>? _basicData3;
// private readonly EnrichPutPolicyRequestDescriptor<SampleData> _existing = new("test");
// private readonly EnrichPutPolicyRequestDescriptorV2<SampleData> _newV1 = new("test");
// private readonly EnrichPutPolicyRequestDescriptorV3<SampleData> _newV2 = new("test");
// private readonly EnrichPutPolicyRequestDescriptorV4<SampleData> _newV3 = new("test");
// private readonly Policy? _policy = new() { Name = "TEST" };
// private readonly EnrichPutPolicyRequestDescriptor<SampleData> _serializableExisting = new("test");
// private readonly EnrichPutPolicyRequestDescriptorV2<SampleData> _serializableNewV1 = new("test");
// private readonly EnrichPutPolicyRequestDescriptorV3<SampleData> _serializableNewV2 = new("test");
// private readonly EnrichPutPolicyRequestDescriptorV4<SampleData> _serializableNewV3 = new("test");
// private static readonly ElasticsearchClientSettings Settings = new();
// private readonly DefaultRequestResponseSerializer _serializer = new(Settings);
// private readonly MemoryStream _stream = new();
// [GlobalSetup]
// public void Setup()
// {
// _serializableExisting.GeoMatch(_policy);
// _serializableNewV1.GeoMatch(_policy);
// _serializableNewV2.GeoMatch(_policy);
// _serializableNewV3.GeoMatch(_policy);
// }
// [Benchmark]
// public void Existing() => _data1 = new EnrichPutPolicyRequestDescriptor<SampleData>("name");
// [Benchmark]
// public void NewV1() => _data2 = new EnrichPutPolicyRequestDescriptorV2<SampleData>("name");
// [Benchmark]
// public void NewV2() => _data3 = new EnrichPutPolicyRequestDescriptorV3<SampleData>("name");
// [Benchmark]
// public void NewV3() => _data4 = new EnrichPutPolicyRequestDescriptorV4<SampleData>("name");
// //[Benchmark]
// //public void Existing() => _basicData1 = new Existing<SampleData>();
// //[Benchmark]
// //public void NewV1() => _basicData2 = new NewV1<SampleData>();
// //[Benchmark]
// //public void NewV2() => _basicData3 = new NewV2<SampleData>();
// [Benchmark]
// public void SetExisting() => _existing.GeoMatch(_policy);
// [Benchmark]
// public void SetNewV1() => _newV1.GeoMatch(_policy);
// [Benchmark]
// public void SetNewV2() => _newV2.GeoMatch(_policy);
// [Benchmark]
// public void SetNewV3() => _newV3.GeoMatch(_policy);
// [Benchmark]
// public void SerialiseExisting()
// {
// _stream.Position = 0;
// _serializer.Serialize(_serializableExisting, _stream);
// }
// [Benchmark]
// public void SerialiseNewV1()
// {
// _stream.Position = 0;
// _serializer.Serialize(_serializableNewV1, _stream);
// }
// [Benchmark]
// public void SerialiseNewV2()
// {
// _stream.Position = 0;
// _serializer.Serialize(_serializableNewV2, _stream);
// }
// [Benchmark]
// public void SerialiseNewV3()
// {
// _stream.Position = 0;
// _serializer.Serialize(_serializableNewV3, _stream);
// }
//}
// RESULT OF ABOVE:
//| Method | Mean [ns] | Error [ns] | StdDev [ns] | Gen 0 | Gen 1 | Allocated [B] |
//|------------------ |-----------:|-----------:|------------:|-------:|-------:|--------------:|
//| Existing | 116.408 ns | 2.1955 ns | 2.1563 ns | 0.0942 | 0.0002 | 592 B |
//| NewV1 | 113.021 ns | 1.8475 ns | 1.8145 ns | 0.0943 | 0.0004 | 592 B |
//| NewV2 | 115.728 ns | 2.2291 ns | 2.0851 ns | 0.0905 | 0.0002 | 568 B |
//| NewV3 | 112.813 ns | 2.2198 ns | 3.1118 ns | 0.0867 | 0.0002 | 544 B |
//| SetExisting | 1.688 ns | 0.0384 ns | 0.0340 ns | - | - | - |
//| SetNewV1 | 2.200 ns | 0.0232 ns | 0.0217 ns | - | - | - |
//| SetNewV2 | 2.555 ns | 0.0289 ns | 0.0256 ns | - | - | - |
//| SetNewV3 | 1.691 ns | 0.0306 ns | 0.0286 ns | - | - | - |
//| SerialiseExisting | 461.120 ns | 9.0066 ns | 8.4248 ns | 0.0687 | - | 432 B |
//| SerialiseNewV1 | 472.239 ns | 8.4655 ns | 7.9186 ns | 0.0687 | - | 432 B |
//| SerialiseNewV2 | 476.059 ns | 9.2350 ns | 10.2647 ns | 0.0687 | - | 432 B |
//| SerialiseNewV3 | 483.717 ns | 9.5424 ns | 8.9260 ns | 0.0687 | - | 432 B |
public class BulkIngest
{
//private static readonly List<SampleData> Data = Enumerable.Range(0, 100).Select(r => new SampleData()).ToList();
private static readonly ElasticClient NestClient = new(new ConnectionSettings(new Uri("https://localhost:9600"))
.BasicAuthentication("elastic", "c236sjjbMP3nUGDxU_Z6")
.ServerCertificateValidationCallback((a, b, c, d) => true)
.EnableApiVersioningHeader());
private static readonly ElasticsearchClient AlphaClient = new(new ElasticsearchClientSettings(new Uri("https://localhost:9600"))
.Authentication(new BasicAuthentication("elastic", "c236sjjbMP3nUGDxU_Z6"))
.ServerCertificateValidationCallback((a, b, c, d) => true));
private static readonly MemoryStream Stream = new(Encoding.UTF8.GetBytes(@"{""cluster_name"":""my-test-cluster"",""status"":""yellow"",""timed_out"":false,""number_of_nodes"":1,""number_of_data_nodes"":1,""active_primary_shards"":6,""active_shards"":6,""relocating_shards"":0,""initializing_shards"":0,""unassigned_shards"":4,""delayed_unassigned_shards"":0,""number_of_pending_tasks"":0,""number_of_in_flight_fetch"":0,""task_max_waiting_in_queue_millis"":0,""active_shards_percent_as_number"":60.0}"));
[Benchmark]
public void Version7()
{
Stream.Position = 0;
_ = NestClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponse>(Stream);
}
[Benchmark]
public void Version8()
{
Stream.Position = 0;
_ = AlphaClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponse>(Stream);
}
// [Benchmark]
// public void Version8_String()
// {
// Stream.Position = 0;
// _ = AlphaClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponseV2>(Stream);
// }
//[Benchmark]
//public void Version8_String_Converter()
//{
// Stream.Position = 0;
// _ = AlphaClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponseV3>(Stream);
//}
//[Benchmark]
//public void Version8_String_ConverterWithBool()
//{
// Stream.Position = 0;
// _ = AlphaClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponseV3_BoolFlags>(Stream);
//}
//[Benchmark]
//public void Version8_String_ConverterWithSpan()
//{
// Stream.Position = 0;
// _ = AlphaClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponseV3_Span>(Stream);
//}
//[Benchmark]
//public void Version8_SourceWithoutUsingContext()
//{
// Stream.Position = 0;
// _ = AlphaClient.RequestResponseSerializer.Deserialize<Elastic.Clients.Elasticsearch.Cluster.HealthResponseV4>(Stream);
//}
//[Benchmark]
//public void Version8_SourceDirect()
//{
// Stream.Position = 0;
// _ = JsonSerializer.Deserialize(Stream, Elastic.Clients.Elasticsearch.Cluster.HealthResponseV4Context.Default.HealthResponseV4);
//}
}
public class SampleData
{
public SampleData() => Value = Guid.NewGuid();
public Guid Value { get; }
}
}