Skip to content

Commit d312416

Browse files
authored
Merge pull request #129 from PrometheusClientNet/performance-tweaks
Performance tweaks
2 parents 9db1233 + 5f1dd1e commit d312416

File tree

9 files changed

+29
-38
lines changed

9 files changed

+29
-38
lines changed

src/Prometheus.Client/Collectors/CollectorRegistry.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ private void AddInternal(ICollector collector)
200200

201201
_collectors.Add(collector.Configuration.Name, collector);
202202
_usedMetricNames.UnionWith(collector.MetricNames);
203-
_enumerableCollectors = new Lazy<IEnumerable<ICollector>>(GetImmutableValueCollection);
203+
if (_enumerableCollectors.IsValueCreated)
204+
_enumerableCollectors = new Lazy<IEnumerable<ICollector>>(GetImmutableValueCollection);
204205
}
205206

206207
private IEnumerable<ICollector> GetImmutableValueCollection()

src/Prometheus.Client/LabelsHelper.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,11 @@ public static int GetHashCode(IReadOnlyList<string> values)
7979
// do not use for-each here, it allocates which is easy to avoid by for loop
8080
for (var i = 0; i < values.Count; i++)
8181
{
82-
if(values[i] == null)
82+
var val = values[i];
83+
if(string.IsNullOrEmpty(val))
8384
throw new ArgumentException("Label value cannot be empty");
8485

85-
result = HashCode.Combine(result, values[i].GetHashCode());
86+
result = HashCombine(result, val.GetHashCode());
8687
}
8788

8889
return result;
@@ -202,6 +203,13 @@ private static void Fill<T>(this IList<T> target, T value, int offset, int size)
202203
}
203204
}
204205

206+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
207+
private static int HashCombine(int h1, int h2)
208+
{
209+
uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27);
210+
return ((int)rol5 + h1) ^ h2;
211+
}
212+
205213
private static bool Validate(Type tupleType)
206214
{
207215
if (tupleType == typeof(ValueTuple))
@@ -256,9 +264,9 @@ public static int GetTupleHashCode(TTuple values)
256264
{
257265
return HashCodeReducer(values, 0, (item, _, aggregated) =>
258266
{
259-
if(item == null)
267+
if(string.IsNullOrEmpty(item))
260268
throw new ArgumentException("Label value cannot be empty");
261-
return HashCode.Combine(aggregated, item.GetHashCode());
269+
return HashCombine(aggregated, item.GetHashCode());
262270
});
263271
}
264272

src/Prometheus.Client/MetricFactory.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -538,14 +538,8 @@ private static void ValidateLabelNames(IReadOnlyList<string> expectedNames, IRea
538538
expectedNames ??= Array.Empty<string>();
539539
actualNames ??= Array.Empty<string>();
540540

541-
if (expectedNames.Count != actualNames.Count)
541+
if (LabelsHelper.GetHashCode(expectedNames) != LabelsHelper.GetHashCode(actualNames))
542542
ThrowLabelsValidationException();
543-
544-
for (var i = 0; i < expectedNames.Count; i++)
545-
{
546-
if(expectedNames[i] != actualNames[i])
547-
ThrowLabelsValidationException();
548-
}
549543
}
550544

551545
private static void ThrowLabelsValidationException()

src/Prometheus.Client/MetricFamily.cs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ TMetric IMetricFamily<TMetric>.WithLabels(params string[] labels)
7272
return metric;
7373
}
7474

75-
metric = CreateLabelled(labels);
75+
metric = _instanceFactory(_configuration, labels);
7676
return _labelledMetrics.GetOrAdd(key, metric);
7777
}
7878

@@ -108,7 +108,7 @@ public TMetric WithLabels(TLabels labels)
108108
return metric;
109109
}
110110

111-
metric = CreateLabelled(LabelsHelper.ToArray(labels));
111+
metric = _instanceFactory(_configuration, LabelsHelper.ToArray(labels));
112112
return _labelledMetrics.GetOrAdd(key, metric);
113113
}
114114

@@ -155,16 +155,5 @@ private IEnumerable<KeyValuePair<IReadOnlyList<string>, TMetric>> EnumerateLabel
155155
foreach (var labelled in _labelledMetrics)
156156
yield return new KeyValuePair<IReadOnlyList<string>, TMetric>(labelled.Value.LabelValues, labelled.Value);
157157
}
158-
159-
private TImplementation CreateLabelled(IReadOnlyList<string> labels)
160-
{
161-
for (var i = 0; i < labels.Count; i++)
162-
{
163-
if(string.IsNullOrEmpty(labels[i]))
164-
throw new ArgumentException("Label cannot be empty.");
165-
}
166-
167-
return _instanceFactory(_configuration, labels);
168-
}
169158
}
170159
}

src/Prometheus.Client/Prometheus.Client.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
3939
<PackageReference Include="System.Memory" Version="4.5.4" />
4040
<PackageReference Include="System.Buffers" Version="4.5.1" />
41-
<PackageReference Include="Microsoft.Bcl.HashCode" Version="1.1.1" />
4241
</ItemGroup>
4342
<PropertyGroup Condition=" '$(TargetFramework)' == 'netstandard2.1' OR '$(TargetFramework)' == 'netcoreapp2.2'">
4443
<DefineConstants>$(DefineConstants);HasITuple;HasNativeSpans;</DefineConstants>

tests/Prometheus.Client.Benchmarks.Comparison/Counter/CounterGeneralUseCaseBenchmarks.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void WithLabels_Array()
7474
{
7575
for (var i = 0; i < _metricsCount; i++)
7676
{
77-
var counter = OurMetricFactory.CreateCounter(_metricNames[i], HelpText, "foo", "bar", "baz");
77+
var counter = OurMetricFactory.CreateCounter(_metricNames[i], HelpText, false, "foo", "bar", "baz");
7878
counter.Inc();
7979
}
8080
}
@@ -96,7 +96,7 @@ public void WithLabels_Int64Array()
9696
{
9797
for (var i = 0; i < _metricsCount; i++)
9898
{
99-
var counter = OurMetricFactory.CreateCounterInt64(_metricNames[i], HelpText, "foo", "bar", "baz");
99+
var counter = OurMetricFactory.CreateCounterInt64(_metricNames[i], HelpText, false, "foo", "bar", "baz");
100100
counter.Inc();
101101
}
102102
}
@@ -130,7 +130,7 @@ public void WithLabelsAndSamples_Array()
130130
{
131131
for (var i = 0; i < _metricsCount; i++)
132132
{
133-
var counter = OurMetricFactory.CreateCounter(_metricNames[i], HelpText, "foo", "bar", "baz");
133+
var counter = OurMetricFactory.CreateCounter(_metricNames[i], HelpText, false, "foo", "bar", "baz");
134134
for(var j = 0; j < _labelValues.Length; j++)
135135
counter.WithLabels(_labelValues[j][0], _labelValues[j][1], _labelValues[j][2]).Inc();
136136
}
@@ -154,7 +154,7 @@ public void WithLabelsAndSamples_Int64Array()
154154
{
155155
for (var i = 0; i < _metricsCount; i++)
156156
{
157-
var counter = OurMetricFactory.CreateCounterInt64(_metricNames[i], HelpText, "foo", "bar", "baz");
157+
var counter = OurMetricFactory.CreateCounterInt64(_metricNames[i], HelpText, false, "foo", "bar", "baz");
158158
for(var j = 0; j < _labelValues.Length; j++)
159159
counter.WithLabels(_labelValues[j][0], _labelValues[j][1], _labelValues[j][2]).Inc();
160160
}

tests/Prometheus.Client.Benchmarks.Comparison/Gauge/GaugeGeneralUseCaseBenchmarks.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void WithLabels_Array()
7474
{
7575
for (var i = 0; i < _metricsCount; i++)
7676
{
77-
var gauge = OurMetricFactory.CreateGauge(_metricNames[i], HelpText, "foo", "bar", "baz");
77+
var gauge = OurMetricFactory.CreateGauge(_metricNames[i], HelpText, false, "foo", "bar", "baz");
7878
gauge.Inc();
7979
}
8080
}
@@ -96,7 +96,7 @@ public void WithLabels_Int64Array()
9696
{
9797
for (var i = 0; i < _metricsCount; i++)
9898
{
99-
var gauge = OurMetricFactory.CreateGaugeInt64(_metricNames[i], HelpText, "foo", "bar", "baz");
99+
var gauge = OurMetricFactory.CreateGaugeInt64(_metricNames[i], HelpText, false, "foo", "bar", "baz");
100100
gauge.Inc();
101101
}
102102
}
@@ -130,7 +130,7 @@ public void WithLabelsAndSamples_Array()
130130
{
131131
for (var i = 0; i < _metricsCount; i++)
132132
{
133-
var gauge = OurMetricFactory.CreateGauge(_metricNames[i], HelpText, "foo", "bar", "baz");
133+
var gauge = OurMetricFactory.CreateGauge(_metricNames[i], HelpText, false, "foo", "bar", "baz");
134134
for(var j = 0; j < _samplesCount; j++)
135135
gauge.WithLabels(_labelValues[j][0], _labelValues[j][1], _labelValues[j][2]).Inc();
136136
}
@@ -154,7 +154,7 @@ public void WithLabelsAndSamples_Int64Array()
154154
{
155155
for (var i = 0; i < _metricsCount; i++)
156156
{
157-
var gauge = OurMetricFactory.CreateGaugeInt64(_metricNames[i], HelpText, "foo", "bar", "baz");
157+
var gauge = OurMetricFactory.CreateGaugeInt64(_metricNames[i], HelpText, false, "foo", "bar", "baz");
158158
for(var j = 0; j < _samplesCount; j++)
159159
gauge.WithLabels(_labelValues[j][0], _labelValues[j][1], _labelValues[j][2]).Inc();
160160
}

tests/Prometheus.Client.Benchmarks.Comparison/Histogram/HistogramGeneralUseCaseBenchmarks.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public void WithLabels_Array()
6363
{
6464
for (var i = 0; i < _metricsCount; i++)
6565
{
66-
var histogram = OurMetricFactory.CreateHistogram(_metricNames[i], HelpText, "foo", "bar", "baz");
66+
var histogram = OurMetricFactory.CreateHistogram(_metricNames[i], HelpText, false,"foo", "bar", "baz");
6767
histogram.Observe(i / 100d);
6868
}
6969
}
@@ -97,7 +97,7 @@ public void WithLabelsAndSamples_Array()
9797
{
9898
for (var i = 0; i < _metricsCount; i++)
9999
{
100-
var histogram = OurMetricFactory.CreateHistogram(_metricNames[i], HelpText, "foo", "bar", "baz");
100+
var histogram = OurMetricFactory.CreateHistogram(_metricNames[i], HelpText, false,"foo", "bar", "baz");
101101
for(var j = 0; j < _samplesCount; j++)
102102
histogram.WithLabels(_labelValues[j][0], _labelValues[j][1], _labelValues[j][2]).Observe(i / 100d);
103103
}

tests/Prometheus.Client.Benchmarks.Comparison/Prometheus.Client.Benchmarks.Comparison.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp3.0</TargetFramework>
4+
<TargetFramework>netcoreapp3.1</TargetFramework>
55
<OutputType>Exe</OutputType>
66
<NoWarn>SA1133</NoWarn>
77
</PropertyGroup>
88

99
<ItemGroup>
1010
<PackageReference Include="BenchmarkDotNet" Version="0.12.0" />
11-
<PackageReference Include="prometheus-net" Version="3.6.0" />
11+
<PackageReference Include="prometheus-net" Version="4.1.1" />
1212
</ItemGroup>
1313

1414
<ItemGroup>

0 commit comments

Comments
 (0)