Skip to content

Commit ea311b3

Browse files
committed
DPL: speedup metricIdxByName
Avoid recalculating size over and over again.
1 parent 287517c commit ea311b3

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

Framework/Core/include/Framework/DeviceMetricsInfo.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,12 @@ struct StringMetric {
4747
char data[MAX_SIZE];
4848
};
4949

50-
// Also for the keys it does not make much sense to keep more than 256 chars.
50+
// Also for the keys it does not make much sense to keep more than 247 chars.
5151
// They should be nevertheless 0 terminated.
5252
struct MetricLabelIndex {
53-
static constexpr size_t MAX_METRIC_LABEL_SIZE = 256 - sizeof(size_t); // Maximum size for a metric name.
53+
static constexpr size_t MAX_METRIC_LABEL_SIZE = 256 - sizeof(size_t) - sizeof(unsigned char); // Maximum size for a metric name.
5454
size_t index;
55+
unsigned char size = 0;
5556
char label[MAX_METRIC_LABEL_SIZE];
5657
};
5758

@@ -169,6 +170,7 @@ struct DeviceMetricsHelper {
169170
strncpy(metricLabelIdx.label, name, MetricLabelIndex::MAX_METRIC_LABEL_SIZE - 1);
170171
metricLabelIdx.label[MetricLabelIndex::MAX_METRIC_LABEL_SIZE - 1] = '\0';
171172
metricLabelIdx.index = metrics.metrics.size();
173+
metricLabelIdx.size = strlen(metricLabelIdx.label);
172174
metrics.metricLabelsIdx.push_back(metricLabelIdx);
173175

174176
// Add the the actual Metric info to the store

Framework/Core/src/DeviceMetricsInfo.cxx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ bool DeviceMetricsHelper::processMetric(ParsedMetricMatch& match,
189189
auto lastChar = std::min(match.endKey - match.beginKey, (ptrdiff_t)MetricLabelIndex::MAX_METRIC_LABEL_SIZE - 1);
190190
memcpy(metricLabelIdx.label, match.beginKey, lastChar);
191191
metricLabelIdx.label[lastChar] = '\0';
192+
metricLabelIdx.size = lastChar;
192193
metricLabelIdx.index = info.metrics.size();
193194
info.metricLabelsIdx.insert(mi, metricLabelIdx);
194195
// Add the the actual Metric info to the store
@@ -261,13 +262,14 @@ bool DeviceMetricsHelper::processMetric(ParsedMetricMatch& match,
261262
return true;
262263
}
263264

264-
size_t
265-
DeviceMetricsHelper::metricIdxByName(const std::string& name, const DeviceMetricsInfo& info)
265+
size_t DeviceMetricsHelper::metricIdxByName(const std::string& name, const DeviceMetricsInfo& info)
266266
{
267267
size_t i = 0;
268268
while (i < info.metricLabelsIdx.size()) {
269269
auto& metricName = info.metricLabelsIdx[i];
270-
if (metricName.label == name) {
270+
// We check the size first and then the last character because that's
271+
// likely to be different for multi-index metrics
272+
if (metricName.size == name.size() && metricName.label[metricName.size - 1] == name[metricName.size - 1] && memcmp(metricName.label, name.c_str(), metricName.size) == 0) {
271273
return metricName.index;
272274
}
273275
++i;

0 commit comments

Comments
 (0)