From 290bfa180407292aa59c05d57637a32c23de3bd4 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 20 Jul 2018 17:05:46 -0400 Subject: [PATCH 1/3] param_package: Get rid of file-static std::string construction Avoids potential dynamic allocation occuring during program launch --- src/common/param_package.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index 3a4914bcb..cc276ff79 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -12,10 +12,11 @@ namespace Common { constexpr char KEY_VALUE_SEPARATOR = ':'; constexpr char PARAM_SEPARATOR = ','; + constexpr char ESCAPE_CHARACTER = '$'; -const std::string KEY_VALUE_SEPARATOR_ESCAPE{ESCAPE_CHARACTER, '0'}; -const std::string PARAM_SEPARATOR_ESCAPE{ESCAPE_CHARACTER, '1'}; -const std::string ESCAPE_CHARACTER_ESCAPE{ESCAPE_CHARACTER, '2'}; +constexpr char KEY_VALUE_SEPARATOR_ESCAPE[] = "$0"; +constexpr char PARAM_SEPARATOR_ESCAPE[] = "$1"; +constexpr char ESCAPE_CHARACTER_ESCAPE[] = "$2"; ParamPackage::ParamPackage(const std::string& serialized) { std::vector pairs; From 5b691d3fe08083a7660b8fa2a23a7852b68052d8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 20 Jul 2018 17:12:24 -0400 Subject: [PATCH 2/3] param_package: Use std::unordered_map's insert_or_assign instead of map indexing This avoids a redundant std::string construction if a key doesn't exist in the map already. e.g. data[key] requires constructing a new default instance of the value in the map (but this is wasteful, since we're already setting something into the map over top of it). --- src/common/param_package.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index cc276ff79..3ed97428e 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -103,15 +103,15 @@ float ParamPackage::Get(const std::string& key, float default_value) const { } void ParamPackage::Set(const std::string& key, const std::string& value) { - data[key] = value; + data.insert_or_assign(key, value); } void ParamPackage::Set(const std::string& key, int value) { - data[key] = std::to_string(value); + data.insert_or_assign(key, std::to_string(value)); } void ParamPackage::Set(const std::string& key, float value) { - data[key] = std::to_string(value); + data.insert_or_assign(key, std::to_string(value)); } bool ParamPackage::Has(const std::string& key) const { From b92af5a858458e64502807670f142327f5543525 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 20 Jul 2018 17:17:26 -0400 Subject: [PATCH 3/3] param_package: Take std::string by value in string-based Set() function Allows avoiding string copies by letting the strings be moved into the function calls. --- src/common/param_package.cpp | 7 ++++--- src/common/param_package.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/common/param_package.cpp b/src/common/param_package.cpp index 3ed97428e..d17486976 100644 --- a/src/common/param_package.cpp +++ b/src/common/param_package.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include "common/logging/log.h" #include "common/param_package.h" @@ -36,7 +37,7 @@ ParamPackage::ParamPackage(const std::string& serialized) { part = Common::ReplaceAll(part, ESCAPE_CHARACTER_ESCAPE, {ESCAPE_CHARACTER}); } - Set(key_value[0], key_value[1]); + Set(key_value[0], std::move(key_value[1])); } } @@ -102,8 +103,8 @@ float ParamPackage::Get(const std::string& key, float default_value) const { } } -void ParamPackage::Set(const std::string& key, const std::string& value) { - data.insert_or_assign(key, value); +void ParamPackage::Set(const std::string& key, std::string value) { + data.insert_or_assign(key, std::move(value)); } void ParamPackage::Set(const std::string& key, int value) { diff --git a/src/common/param_package.h b/src/common/param_package.h index c4c11b221..7842cd4ef 100644 --- a/src/common/param_package.h +++ b/src/common/param_package.h @@ -28,7 +28,7 @@ public: std::string Get(const std::string& key, const std::string& default_value) const; int Get(const std::string& key, int default_value) const; float Get(const std::string& key, float default_value) const; - void Set(const std::string& key, const std::string& value); + void Set(const std::string& key, std::string value); void Set(const std::string& key, int value); void Set(const std::string& key, float value); bool Has(const std::string& key) const;