Add Yyjson benchmarks
This commit is contained in:
parent
1dc4e9a84c
commit
3af54a9978
|
@ -47,10 +47,12 @@ if (TARGET benchmark::benchmark)
|
|||
add_subdirectory(largerandom)
|
||||
add_executable(bench_parse_call bench_parse_call.cpp)
|
||||
add_executable(bench_dom_api bench_dom_api.cpp)
|
||||
if (SIMDJSON_EXCEPTIONS)
|
||||
add_executable(bench_ondemand bench_ondemand.cpp)
|
||||
if (TARGET yyjson)
|
||||
target_link_libraries(bench_ondemand PRIVATE yyjson)
|
||||
endif ()
|
||||
endif (TARGET yyjson)
|
||||
endif (SIMDJSON_EXCEPTIONS)
|
||||
endif()
|
||||
|
||||
include(checkperf.cmake)
|
||||
|
|
|
@ -30,6 +30,10 @@ SIMDJSON_POP_DISABLE_WARNINGS
|
|||
// // yyjson
|
||||
#ifdef SIMDJSON_COMPETITION_YYJSON
|
||||
#include "partial_tweets/yyjson.h"
|
||||
#include "largerandom/yyjson.h"
|
||||
#include "kostya/yyjson.h"
|
||||
#include "distinctuserid/yyjson.h"
|
||||
#include "find_tweet/yyjson.h"
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
#pragma once
|
||||
|
||||
#include "distinctuserid.h"
|
||||
|
||||
namespace distinct_user_id {
|
||||
|
||||
class Yyjson {
|
||||
public:
|
||||
simdjson_really_inline const std::vector<int64_t> &Result() { return ids; }
|
||||
simdjson_really_inline size_t ItemCount() { return ids.size(); }
|
||||
|
||||
private:
|
||||
std::vector<int64_t> ids{};
|
||||
|
||||
public:
|
||||
simdjson_really_inline bool Run(const padded_string &json) {
|
||||
ids.clear();
|
||||
|
||||
// Walk the document, parsing the tweets as we go
|
||||
yyjson_doc *doc = yyjson_read(json.data(), json.size(), 0);
|
||||
if (!doc) { return false; }
|
||||
yyjson_val *root = yyjson_doc_get_root(doc);
|
||||
yyjson_val *statuses = yyjson_obj_get(root, "statuses");
|
||||
|
||||
size_t tweet_idx, tweets_max;
|
||||
yyjson_val *tweet;
|
||||
yyjson_arr_foreach(statuses, tweet_idx, tweets_max, tweet) {
|
||||
auto user = yyjson_obj_get(tweet, "user");
|
||||
auto id = yyjson_obj_get(user, "id");
|
||||
ids.push_back(yyjson_get_sint(id));
|
||||
|
||||
// Not all tweets have a "retweeted_status", but when they do
|
||||
// we want to go and find the user within.
|
||||
auto retweet = yyjson_obj_get(tweet, "retweeted_status");
|
||||
if (retweet) {
|
||||
user = yyjson_obj_get(retweet, "user");
|
||||
id = yyjson_obj_get(user, "id");
|
||||
ids.push_back(yyjson_get_sint(id));
|
||||
}
|
||||
}
|
||||
remove_duplicates(ids);
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
BENCHMARK_TEMPLATE(DistinctUserID, Yyjson);
|
||||
|
||||
} // namespace partial_tweets
|
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
#include "find_tweet.h"
|
||||
|
||||
namespace find_tweet {
|
||||
|
||||
class Yyjson {
|
||||
public:
|
||||
simdjson_really_inline std::string_view Result() { return text; }
|
||||
simdjson_really_inline size_t ItemCount() { return 1; }
|
||||
|
||||
private:
|
||||
std::string_view text{};
|
||||
|
||||
public:
|
||||
simdjson_really_inline bool Run(const padded_string &json) {
|
||||
text = "";
|
||||
|
||||
// Walk the document, parsing the tweets as we go
|
||||
yyjson_doc *doc = yyjson_read(json.data(), json.size(), 0);
|
||||
if (!doc) { return false; }
|
||||
yyjson_val *root = yyjson_doc_get_root(doc);
|
||||
yyjson_val *statuses = yyjson_obj_get(root, "statuses");
|
||||
|
||||
size_t tweet_idx, tweets_max;
|
||||
yyjson_val *tweet;
|
||||
yyjson_arr_foreach(statuses, tweet_idx, tweets_max, tweet) {
|
||||
auto id = yyjson_obj_get(tweet, "id");
|
||||
if (yyjson_get_uint(id) == TWEET_ID) {
|
||||
auto _text = yyjson_obj_get(tweet, "text");
|
||||
text = yyjson_get_str(_text);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
BENCHMARK_TEMPLATE(FindTweet, Yyjson);
|
||||
|
||||
} // namespace find_tweet
|
|
@ -0,0 +1,42 @@
|
|||
#pragma once
|
||||
|
||||
#include "kostya.h"
|
||||
|
||||
namespace kostya {
|
||||
|
||||
class Yyjson {
|
||||
public:
|
||||
simdjson_really_inline const std::vector<my_point> &Result() { return container; }
|
||||
simdjson_really_inline size_t ItemCount() { return container.size(); }
|
||||
|
||||
private:
|
||||
ondemand::parser parser{};
|
||||
std::vector<my_point> container{};
|
||||
|
||||
simdjson_really_inline double get_double(yyjson_val *obj, std::string_view key) {
|
||||
yyjson_val *val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||
return yyjson_get_real(val);
|
||||
}
|
||||
|
||||
public:
|
||||
simdjson_really_inline bool Run(const padded_string &json) {
|
||||
container.clear();
|
||||
|
||||
// Walk the document, parsing the tweets as we go
|
||||
yyjson_doc *doc = yyjson_read(json.data(), json.size(), 0);
|
||||
if (!doc) { return false; }
|
||||
yyjson_val *root = yyjson_doc_get_root(doc);
|
||||
yyjson_val *coords = yyjson_obj_get(root, "coordinates");
|
||||
|
||||
size_t idx, max;
|
||||
yyjson_val *coord;
|
||||
yyjson_arr_foreach(coords, idx, max, coord) {
|
||||
container.emplace_back(my_point{get_double(coord, "x"), get_double(coord, "y"), get_double(coord, "z")});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
BENCHMARK_TEMPLATE(Kostya, Yyjson);
|
||||
|
||||
} // namespace kostya
|
|
@ -1,7 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#if SIMDJSON_EXCEPTIONS
|
||||
|
||||
//
|
||||
// Interface
|
||||
//
|
||||
|
@ -72,5 +70,3 @@ template<typename T> static void LargeRandom(benchmark::State &state) {
|
|||
}
|
||||
|
||||
} // namespace largerandom
|
||||
|
||||
#endif // SIMDJSON_EXCEPTIONS
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
#include "largerandom.h"
|
||||
|
||||
namespace largerandom {
|
||||
|
||||
class Yyjson {
|
||||
public:
|
||||
simdjson_really_inline const std::vector<my_point> &Result() { return container; }
|
||||
simdjson_really_inline size_t ItemCount() { return container.size(); }
|
||||
|
||||
private:
|
||||
ondemand::parser parser{};
|
||||
std::vector<my_point> container{};
|
||||
|
||||
simdjson_really_inline double get_double(yyjson_val *obj, std::string_view key) {
|
||||
yyjson_val *val = yyjson_obj_getn(obj, key.data(), key.length());
|
||||
return yyjson_get_real(val);
|
||||
}
|
||||
|
||||
public:
|
||||
simdjson_really_inline bool Run(const padded_string &json) {
|
||||
container.clear();
|
||||
|
||||
// Walk the document, parsing the tweets as we go
|
||||
yyjson_doc *doc = yyjson_read(json.data(), json.size(), 0);
|
||||
if (!doc) { return false; }
|
||||
yyjson_val *coords = yyjson_doc_get_root(doc);
|
||||
|
||||
size_t idx, max;
|
||||
yyjson_val *coord;
|
||||
yyjson_arr_foreach(coords, idx, max, coord) {
|
||||
container.emplace_back(my_point{get_double(coord, "x"), get_double(coord, "y"), get_double(coord, "z")});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
BENCHMARK_TEMPLATE(LargeRandom, Yyjson);
|
||||
|
||||
} // namespace kostya
|
Loading…
Reference in New Issue