diff options
author | Lee Clagett <code@leeclagett.com> | 2020-05-30 00:58:03 -0400 |
---|---|---|
committer | Lee Clagett <code@leeclagett.com> | 2020-08-14 19:47:19 +0000 |
commit | 98c151ecb8dd887ef9ade5442de467875b8f16f5 (patch) | |
tree | eb5daf92d298c3ad9e818dc4b2b7b1403576fef2 | |
parent | Switch to insitu parsing for ZMQ-JSON; GetBlocksFast reads 13%+ faster (diff) | |
download | monero-98c151ecb8dd887ef9ade5442de467875b8f16f5.tar.xz |
Optimize ZMQ-JSON vector reading; GetBlocksFast reads 24%+ faster
-rw-r--r-- | src/serialization/json_object.h | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/serialization/json_object.h b/src/serialization/json_object.h index 1dc6451cf..b5d0f1508 100644 --- a/src/serialization/json_object.h +++ b/src/serialization/json_object.h @@ -32,6 +32,7 @@ #include <cstring> #include <rapidjson/document.h> #include <rapidjson/writer.h> +#include <vector> #include "byte_stream.h" #include "cryptonote_basic/cryptonote_basic.h" @@ -341,6 +342,7 @@ inline typename std::enable_if<sfinae::is_map_like<Map>::value, void>::type from auto itr = val.MemberBegin(); + map.clear(); while (itr != val.MemberEnd()) { typename Map::key_type k; @@ -361,6 +363,19 @@ inline typename std::enable_if<sfinae::is_vector_like<Vec>::value, void>::type t dest.EndArray(); } +namespace traits +{ + template<typename T> + void reserve(const T&, std::size_t) + {} + + template<typename T> + void reserve(std::vector<T>& vec, const std::size_t count) + { + vec.reserve(count); + } +} + template <typename Vec> inline typename std::enable_if<sfinae::is_vector_like<Vec>::value, void>::type fromJsonValue(const rapidjson::Value& val, Vec& vec) { @@ -369,11 +384,12 @@ inline typename std::enable_if<sfinae::is_vector_like<Vec>::value, void>::type f throw WRONG_TYPE("json array"); } + vec.clear(); + traits::reserve(vec, val.Size()); for (rapidjson::SizeType i=0; i < val.Size(); i++) { - typename Vec::value_type v; - fromJsonValue(val[i], v); - vec.push_back(v); + vec.emplace_back(); + fromJsonValue(val[i], vec.back()); } } |