Skip to content

Instantly share code, notes, and snippets.

@guitarrapc
Last active August 26, 2022 03:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guitarrapc/96371faa35ac5f32f7f6c365fac536c1 to your computer and use it in GitHub Desktop.
Save guitarrapc/96371faa35ac5f32f7f6c365fac536c1 to your computer and use it in GitHub Desktop.
Benchmark datadog C# library based on https://github.com/verdie-g/DatadogStatsD
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.12.1" />
<PackageReference Include="DatadogSharp" Version="1.5.5.1" />
<PackageReference Include="DogStatsD-CSharp-Client" Version="7.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DatadogStatsD\DatadogStatsD.csproj" />
</ItemGroup>
</Project>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using StatsdClient;
namespace DatadogStatsD.Benchmark
{
class Program
{
static void Main()
{
BenchmarkRunner.Run<Benchmark.Count>();
BenchmarkRunner.Run<Benchmark.Histogram>();
}
}
public class Benchmark
{
private const int Operations = 10_000;
private static readonly IPEndPoint Endpoint = IPEndPoint.Parse("127.0.0.1:2020");
private static readonly string Namespace = "ns";
private static readonly string MetricName = "example_metric.increment";
private static readonly double SamplingRate = 1.0;
private static readonly string[] ConstantTags = { "env:prod", "service:my_service", "instance:my_instance" };
private static readonly string[] Tags = { "name:toto" };
[MemoryDiagnoser]
public class Count
{
private readonly Socket _agent = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private Metrics.Count _datadogStatsD;
private DatadogSharp.DogStatsd.DatadogStats _datadogSharp;
private DogStatsdService _dogStatsDService;
[GlobalSetup]
public void GlobalSetup()
{
_agent.Bind(Endpoint);
_datadogStatsD = new DogStatsD(new DogStatsDConfiguration
{
EndPoint = Endpoint,
Namespace = Namespace,
ConstantTags = ParseTags(ConstantTags).ToArray(),
}).CreateCount(MetricName, ParseTags(Tags).ToArray());
_datadogSharp = new DatadogSharp.DogStatsd.DatadogStats(Endpoint.Address.ToString(), Endpoint.Port,
Namespace, ConstantTags);
_dogStatsDService = new DogStatsdService();
_dogStatsDService.Configure(new StatsdConfig
{
Prefix = Namespace,
ConstantTags = ConstantTags,
StatsdServerName = Endpoint.Address.ToString(),
StatsdPort = Endpoint.Port
});
}
[Benchmark(Description = "verdie-g/DatadogStatsD", OperationsPerInvoke = Operations)]
public void DatadogStatsD()
{
for (int i = 0; i < Operations; i += 1)
{
_datadogStatsD.Increment(i);
}
}
[Benchmark(Description = "Datadog/dogstatsd-csharp-client", OperationsPerInvoke = Operations)]
public void DogStatsDService()
{
for (int i = 0; i < Operations; i += 1)
{
_dogStatsDService.Counter(MetricName, i, SamplingRate, Tags);
}
}
[Benchmark(Description = "neuecc/DatadogSharp", OperationsPerInvoke = Operations)]
public void DatadogSharp()
{
for (int i = 0; i < Operations; i += 1)
{
_datadogSharp.Increment(MetricName, i, SamplingRate, Tags);
}
}
}
[MemoryDiagnoser]
public class Histogram
{
private readonly Socket _agent = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private Metrics.Histogram _datadogStatsD;
private DatadogSharp.DogStatsd.DatadogStats _datadogSharp;
private DogStatsdService _dogStatsDService;
[GlobalSetup]
public void GlobalSetup()
{
_agent.Bind(Endpoint);
_datadogStatsD = new DogStatsD(new DogStatsDConfiguration
{
EndPoint = Endpoint,
Namespace = Namespace,
ConstantTags = ParseTags(ConstantTags).ToArray(),
}).CreateHistogram(MetricName, 1.0, ParseTags(Tags).ToArray());
_datadogSharp = new DatadogSharp.DogStatsd.DatadogStats(Endpoint.Address.ToString(), Endpoint.Port,
Namespace, ConstantTags);
_dogStatsDService = new DogStatsdService();
_dogStatsDService.Configure(new StatsdConfig
{
Prefix = Namespace,
ConstantTags = ConstantTags,
StatsdServerName = Endpoint.Address.ToString(),
StatsdPort = Endpoint.Port
});
}
[Benchmark(Description = "verdie-g/DatadogStatsD", OperationsPerInvoke = Operations)]
public void DatadogStatsD()
{
for (int i = 0; i < Operations; i += 1)
{
_datadogStatsD.Sample(i);
}
}
[Benchmark(Description = "Datadog/dogstatsd-csharp-client", OperationsPerInvoke = Operations)]
public void DogStatsDService()
{
for (int i = 0; i < Operations; i += 1)
{
_dogStatsDService.Histogram(MetricName, i, SamplingRate, Tags);
}
}
[Benchmark(Description = "neuecc/DatadogSharp", OperationsPerInvoke = Operations)]
public void DatadogSharp()
{
for (int i = 0; i < Operations; i += 1)
{
_datadogSharp.Histogram(MetricName, i, SamplingRate, Tags);
}
}
}
public static IEnumerable<KeyValuePair<string, string>> ParseTags(IEnumerable<string> tags)
{
foreach (string tag in tags)
{
var parts = tag.Split(':', 2, StringSplitOptions.RemoveEmptyEntries);
string key = parts[0];
string value = parts.Length > 1 ? parts[1] : string.Empty;
yield return KeyValuePair.Create(key, value);
}
}
}
}

// * Summary *

BenchmarkDotNet=v0.12.1, OS=Windows 10.0.22000 AMD Ryzen 9 5900X, 1 CPU, 24 logical and 12 physical cores .NET Core SDK=6.0.302 [Host] : .NET Core 6.0.7 (CoreCLR 6.0.722.32202, CoreFX 6.0.722.32202), X64 RyuJIT [AttachedDebugger] DefaultJob : .NET Core 6.0.7 (CoreCLR 6.0.722.32202, CoreFX 6.0.722.32202), X64 RyuJIT

Count

Method Mean Error StdDev Gen 0 Gen 1 Gen 2 Allocated
verdie-g/DatadogStatsD 1.560 ns 0.0199 ns 0.0176 ns - - - -
Datadog/dogstatsd-csharp-client 54.196 ns 0.4120 ns 0.3653 ns 0.0013 - - 22 B
neuecc/DatadogSharp 4,506.410 ns 40.2376 ns 37.6383 ns 0.0273 - - 599 B

Histogram

Method Mean Error StdDev Median Gen 0 Gen 1 Gen 2 Allocated
verdie-g/DatadogStatsD 105.21 ns 1.939 ns 3.737 ns 104.54 ns - - - -
Datadog/dogstatsd-csharp-client 48.32 ns 1.855 ns 5.469 ns 51.29 ns - - - 1 B
neuecc/DatadogSharp 4,722.11 ns 88.838 ns 83.099 ns 4,755.95 ns 0.0273 - - 599 B
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment