Skip to content

Commit 4825e10

Browse files
Étienne DupuisSergeyRyabinin
Étienne Dupuis
authored andcommitted
Remove maps built on each call of some conversion functions.
The said map should have been static as a 'TODO' in the code explains. Since the static keyword was removed when the `std::map` was changed to an `Aws::Map`, the map is rebuilt at each calls, which is a lot of work, and calls to `malloc`/`free`. Although the search is now linear instead of logarithmic, the number of entries is quite small and it's always better than rebuilding the map at each call. This saves about 300 mallocs per PutObject request for example.
1 parent b43cee1 commit 4825e10

File tree

2 files changed

+43
-73
lines changed

2 files changed

+43
-73
lines changed

Diff for: src/aws-cpp-sdk-core/include/smithy/tracing/TracingUtils.h

+14-25
Original file line numberDiff line numberDiff line change
@@ -134,32 +134,21 @@ namespace smithy {
134134
* @return A tuple of metric name to measurement unit.
135135
*/
136136
static std::pair<Aws::String, Aws::String> ConvertCoreMetricToSmithy(const Aws::String &name) {
137-
//TODO: Make static map, Aws::Map cannot be made static with a customer memory manager as of the moment.
138-
Aws::Map<int, std::pair<Aws::String, Aws::String>> metricsTypeToName =
139-
{
140-
std::pair<int, std::pair<Aws::String, Aws::String>>(
141-
static_cast<int>(Aws::Monitoring::HttpClientMetricsType::DnsLatency),
142-
std::make_pair(SMITHY_METRICS_DNS_DURATION, MICROSECOND_METRIC_TYPE)),
143-
std::pair<int, std::pair<Aws::String, Aws::String>>(
144-
static_cast<int>(Aws::Monitoring::HttpClientMetricsType::ConnectLatency),
145-
std::make_pair(SMITHY_METRICS_CONNECT_DURATION, MICROSECOND_METRIC_TYPE)),
146-
std::pair<int, std::pair<Aws::String, Aws::String>>(
147-
static_cast<int>(Aws::Monitoring::HttpClientMetricsType::SslLatency),
148-
std::make_pair(SMITHY_METRICS_SSL_DURATION, MICROSECOND_METRIC_TYPE)),
149-
std::pair<int, std::pair<Aws::String, Aws::String>>(
150-
static_cast<int>(Aws::Monitoring::HttpClientMetricsType::DownloadSpeed),
151-
std::make_pair(SMITHY_METRICS_DOWNLOAD_SPEED_METRIC, BYTES_PER_SECOND_METRIC_TYPE)),
152-
std::pair<int, std::pair<Aws::String, Aws::String>>(
153-
static_cast<int>(Aws::Monitoring::HttpClientMetricsType::UploadSpeed),
154-
std::make_pair(SMITHY_METRICS_UPLOAD_SPEED_METRIC, BYTES_PER_SECOND_METRIC_TYPE)),
155-
};
156-
157-
auto metricType = Aws::Monitoring::GetHttpClientMetricTypeByName(name);
158-
auto it = metricsTypeToName.find(static_cast<int>(metricType));
159-
if (it == metricsTypeToName.end()) {
160-
return std::make_pair(SMITHY_METRICS_UNKNOWN_METRIC, "unknown");
137+
switch (Aws::Monitoring::GetHttpClientMetricTypeByName(name))
138+
{
139+
case Aws::Monitoring::HttpClientMetricsType::DnsLatency:
140+
return std::make_pair(SMITHY_METRICS_DNS_DURATION, MICROSECOND_METRIC_TYPE);
141+
case Aws::Monitoring::HttpClientMetricsType::ConnectLatency:
142+
return std::make_pair(SMITHY_METRICS_CONNECT_DURATION, MICROSECOND_METRIC_TYPE);
143+
case Aws::Monitoring::HttpClientMetricsType::SslLatency:
144+
return std::make_pair(SMITHY_METRICS_SSL_DURATION, MICROSECOND_METRIC_TYPE);
145+
case Aws::Monitoring::HttpClientMetricsType::DownloadSpeed:
146+
return std::make_pair(SMITHY_METRICS_DOWNLOAD_SPEED_METRIC, BYTES_PER_SECOND_METRIC_TYPE);
147+
case Aws::Monitoring::HttpClientMetricsType::UploadSpeed:
148+
return std::make_pair(SMITHY_METRICS_UPLOAD_SPEED_METRIC, BYTES_PER_SECOND_METRIC_TYPE);
149+
default:
150+
return std::make_pair(SMITHY_METRICS_UNKNOWN_METRIC, "unknown");
161151
}
162-
return it->second;
163152
}
164153
};
165154
}

Diff for: src/aws-cpp-sdk-core/source/monitoring/HttpClientMetrics.cpp

+29-48
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0.
44
*/
55

6-
#include <aws/core/utils/HashingUtils.h>
6+
#include <aws/core/utils/memory/stl/AWSArray.h>
77
#include <aws/core/monitoring/HttpClientMetrics.h>
88

99
namespace Aws
@@ -18,64 +18,45 @@ namespace Aws
1818
static const char HTTP_CLIENT_METRICS_DNS_LATENCY[] = "DnsLatency";
1919
static const char HTTP_CLIENT_METRICS_TCP_LATENCY[] = "TcpLatency";
2020
static const char HTTP_CLIENT_METRICS_SSL_LATENCY[] = "SslLatency";
21-
static const char HTTP_CLIENT_METRICS_THROUGHPUT[] = "Throughput";
2221
static const char HTTP_CLIENT_METRICS_DOWNLOAD_SPEED[] = "DownloadSpeed";
22+
static const char HTTP_CLIENT_METRICS_THROUGHPUT[] = "Throughput";
2323
static const char HTTP_CLIENT_METRICS_UPLOAD_SPEED[] = "UploadSpeed";
2424
static const char HTTP_CLIENT_METRICS_UNKNOWN[] = "Unknown";
2525

26-
using namespace Aws::Utils;
27-
HttpClientMetricsType GetHttpClientMetricTypeByName(const Aws::String& name)
26+
static const Aws::Array<std::pair<HttpClientMetricsType, const char*>, 12> httpClientMetricsNames =
2827
{
29-
//TODO: Make static map, Aws::Map cannot be made static with a customer memory manager as of the moment.
30-
Aws::Map<int, HttpClientMetricsType> metricsNameHashToType =
31-
{
32-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_DESTINATION_IP), HttpClientMetricsType::DestinationIp),
33-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_ACQUIRE_CONNECTION_LATENCY), HttpClientMetricsType::AcquireConnectionLatency),
34-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_CONNECTION_REUSED), HttpClientMetricsType::ConnectionReused),
35-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_CONNECTION_LATENCY), HttpClientMetricsType::ConnectLatency),
36-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_REQUEST_LATENCY), HttpClientMetricsType::RequestLatency),
37-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_DNS_LATENCY), HttpClientMetricsType::DnsLatency),
38-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_TCP_LATENCY), HttpClientMetricsType::TcpLatency),
39-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_SSL_LATENCY), HttpClientMetricsType::SslLatency),
40-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_THROUGHPUT), HttpClientMetricsType::Throughput),
41-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_DOWNLOAD_SPEED), HttpClientMetricsType::DownloadSpeed),
42-
std::pair<int, HttpClientMetricsType>(HashingUtils::HashString(HTTP_CLIENT_METRICS_UPLOAD_SPEED), HttpClientMetricsType::UploadSpeed),
43-
};
28+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::DestinationIp, HTTP_CLIENT_METRICS_DESTINATION_IP),
29+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::AcquireConnectionLatency, HTTP_CLIENT_METRICS_ACQUIRE_CONNECTION_LATENCY),
30+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::ConnectionReused, HTTP_CLIENT_METRICS_CONNECTION_REUSED),
31+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::ConnectLatency, HTTP_CLIENT_METRICS_CONNECTION_LATENCY),
32+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::RequestLatency, HTTP_CLIENT_METRICS_REQUEST_LATENCY),
33+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::DnsLatency, HTTP_CLIENT_METRICS_DNS_LATENCY),
34+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::TcpLatency, HTTP_CLIENT_METRICS_TCP_LATENCY),
35+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::SslLatency, HTTP_CLIENT_METRICS_SSL_LATENCY),
36+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::DownloadSpeed, HTTP_CLIENT_METRICS_DOWNLOAD_SPEED),
37+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::Throughput, HTTP_CLIENT_METRICS_THROUGHPUT),
38+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::UploadSpeed, HTTP_CLIENT_METRICS_UPLOAD_SPEED),
39+
std::pair<HttpClientMetricsType, const char *>(HttpClientMetricsType::Unknown, HTTP_CLIENT_METRICS_UNKNOWN),
40+
};
4441

45-
int nameHash = HashingUtils::HashString(name.c_str());
46-
auto it = metricsNameHashToType.find(nameHash);
47-
if (it == metricsNameHashToType.end())
48-
{
49-
return HttpClientMetricsType::Unknown;
50-
}
51-
return it->second;
42+
HttpClientMetricsType GetHttpClientMetricTypeByName(const Aws::String& name)
43+
{
44+
auto it = std::find_if(httpClientMetricsNames.begin(), httpClientMetricsNames.end(), [&](const std::pair<HttpClientMetricsType, const char *>& pair) { return name == pair.second; });
45+
if (it == httpClientMetricsNames.end())
46+
{
47+
return HttpClientMetricsType::Unknown;
48+
}
49+
return it->first;
5250
}
5351

5452
Aws::String GetHttpClientMetricNameByType(HttpClientMetricsType type)
5553
{
56-
//TODO: Make static map, Aws::Map cannot be made static with a customer memory manager as of the moment.
57-
Aws::Map<int, Aws::String> metricsTypeToName =
58-
{
59-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::DestinationIp), HTTP_CLIENT_METRICS_DESTINATION_IP),
60-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::AcquireConnectionLatency), HTTP_CLIENT_METRICS_ACQUIRE_CONNECTION_LATENCY),
61-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::ConnectionReused), HTTP_CLIENT_METRICS_CONNECTION_REUSED),
62-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::ConnectLatency), HTTP_CLIENT_METRICS_CONNECTION_LATENCY),
63-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::RequestLatency), HTTP_CLIENT_METRICS_REQUEST_LATENCY),
64-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::DnsLatency), HTTP_CLIENT_METRICS_DNS_LATENCY),
65-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::TcpLatency), HTTP_CLIENT_METRICS_TCP_LATENCY),
66-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::SslLatency), HTTP_CLIENT_METRICS_SSL_LATENCY),
67-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::Throughput), HTTP_CLIENT_METRICS_THROUGHPUT),
68-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::DownloadSpeed), HTTP_CLIENT_METRICS_DOWNLOAD_SPEED),
69-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::UploadSpeed), HTTP_CLIENT_METRICS_UPLOAD_SPEED),
70-
std::pair<int, Aws::String>(static_cast<int>(HttpClientMetricsType::Unknown), HTTP_CLIENT_METRICS_UNKNOWN),
71-
};
72-
73-
auto it = metricsTypeToName.find(static_cast<int>(type));
74-
if (it == metricsTypeToName.end())
75-
{
54+
assert(static_cast<unsigned>(type) < httpClientMetricsNames.size());
55+
if (static_cast<unsigned>(type) >= httpClientMetricsNames.size())
7656
return HTTP_CLIENT_METRICS_UNKNOWN;
77-
}
78-
return Aws::String(it->second.c_str());
57+
58+
assert(httpClientMetricsNames[static_cast<int>(type)].first == type);
59+
return Aws::String(httpClientMetricsNames[static_cast<int>(type)].second);
7960
}
8061

8162
}

0 commit comments

Comments
 (0)