aboutsummaryrefslogtreecommitdiff
path: root/src/serialization/json_object.h
diff options
context:
space:
mode:
authorLee Clagett <code@leeclagett.com>2020-05-30 00:58:03 -0400
committerLee Clagett <code@leeclagett.com>2020-08-14 19:47:19 +0000
commit98c151ecb8dd887ef9ade5442de467875b8f16f5 (patch)
treeeb5daf92d298c3ad9e818dc4b2b7b1403576fef2 /src/serialization/json_object.h
parentSwitch to insitu parsing for ZMQ-JSON; GetBlocksFast reads 13%+ faster (diff)
downloadmonero-98c151ecb8dd887ef9ade5442de467875b8f16f5.tar.xz
Optimize ZMQ-JSON vector reading; GetBlocksFast reads 24%+ faster
Diffstat (limited to 'src/serialization/json_object.h')
-rw-r--r--src/serialization/json_object.h22
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());
}
}