mirror of
https://github.com/monero-project/monero.git
synced 2024-11-17 16:27:39 +00:00
Optimize ZMQ-JSON vector reading; GetBlocksFast reads 24%+ faster
This commit is contained in:
parent
60627c9f24
commit
98c151ecb8
1 changed files with 19 additions and 3 deletions
|
@ -32,6 +32,7 @@
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <rapidjson/document.h>
|
#include <rapidjson/document.h>
|
||||||
#include <rapidjson/writer.h>
|
#include <rapidjson/writer.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "byte_stream.h"
|
#include "byte_stream.h"
|
||||||
#include "cryptonote_basic/cryptonote_basic.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();
|
auto itr = val.MemberBegin();
|
||||||
|
|
||||||
|
map.clear();
|
||||||
while (itr != val.MemberEnd())
|
while (itr != val.MemberEnd())
|
||||||
{
|
{
|
||||||
typename Map::key_type k;
|
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();
|
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>
|
template <typename Vec>
|
||||||
inline typename std::enable_if<sfinae::is_vector_like<Vec>::value, void>::type fromJsonValue(const rapidjson::Value& val, Vec& 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");
|
throw WRONG_TYPE("json array");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec.clear();
|
||||||
|
traits::reserve(vec, val.Size());
|
||||||
for (rapidjson::SizeType i=0; i < val.Size(); i++)
|
for (rapidjson::SizeType i=0; i < val.Size(); i++)
|
||||||
{
|
{
|
||||||
typename Vec::value_type v;
|
vec.emplace_back();
|
||||||
fromJsonValue(val[i], v);
|
fromJsonValue(val[i], vec.back());
|
||||||
vec.push_back(v);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue