Skip to content

Commit

Permalink
Merge pull request #187 from bbbgan/master
Browse files Browse the repository at this point in the history
  • Loading branch information
qicosmos authored Jul 10, 2023
2 parents a2be336 + 88e9811 commit 369fcd0
Show file tree
Hide file tree
Showing 12 changed files with 3,306 additions and 3,145 deletions.
5 changes: 0 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,6 @@ include_directories(
${IGUANA_DIR}
)

set(EXAMPLE
example/example.cpp
)

set(JSON_EXAMPLE
example/json_example.cpp
Expand All @@ -57,7 +54,6 @@ set(YAMLBENCH benchmark/yaml_benchmark.cpp)
set(TEST_NOTHROW test/test_yaml_nothrow.cpp)
set(TEST_UTIL test/test_util.cpp)

add_executable(example ${EXAMPLE})
add_executable(json_example ${JSON_EXAMPLE})
add_executable(xml_example ${XML_EXAMPLE})
add_executable(yaml_example ${YAML_EXAMPLE})
Expand All @@ -72,7 +68,6 @@ add_executable(yaml_benchmark ${YAMLBENCH})
add_executable(test_nothrow ${TEST_NOTHROW})
add_executable(test_util ${TEST_UTIL})


# unit test
option(BUILD_UNIT_TESTS "Build unit tests" ON)
if (BUILD_UNIT_TESTS)
Expand Down
67 changes: 38 additions & 29 deletions benchmark/xml_bench.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
// ************ struct for filelists.xml ****************

struct package_t {
std::string_view version;
std::optional<std::string_view> version;
std::vector<std::string_view> file;
};
REFLECTION(package_t, version, file);
Expand All @@ -27,57 +27,66 @@ struct filelists_t {
REFLECTION(filelists_t, package);
// ************ struct for sample_rss.xml ****************

struct skip_t {
std::string_view skip;
};
REFLECTION(skip_t, skip);
struct item_t {
std::string_view title;
std::optional<std::string_view> description;
std::string_view link;
skip_t description;
std::string_view pubDate;
std::optional<std::string_view> enclosure;
std::string_view guid;
std::string_view itunes_explicit;
std::optional<std::string_view> dc_creator;
std::string_view media_thumbnail;
std::string_view media_content;
std::string_view itunes_author;
std::string_view itunes_subtitle;
std::string_view itunes_summary;
skip_t itunes_summary;
std::string_view itunes_explicit;
std::string_view itunes_duration;
std::string_view dc_creator;
std::string_view author;
std::optional<std::string_view> media_thumbnail;
std::optional<std::string_view> media_content;
std::string_view itunes_keywords;
};
REFLECTION(item_t, title, description, pubDate, enclosure, guid,
itunes_explicit, dc_creator, media_thumbnail, media_content,
itunes_subtitle, itunes_summary, itunes_keywords)
REFLECTION(item_t, title, link, description, pubDate, enclosure, guid,
itunes_author, itunes_subtitle, itunes_summary, itunes_explicit,
itunes_duration, dc_creator, author, media_thumbnail, media_content,
itunes_keywords);

struct itunes_owner_t {
std::string_view itunes_email;
struct image_t {
std::string_view link;
std::string_view url;
std::string_view title;
};
REFLECTION(itunes_owner_t, itunes_email);
REFLECTION(image_t, link, url, title);

struct channel_t {
std::string_view title;
std::string_view link;
std::optional<std::string_view> description;
std::string_view description;
std::string_view generator;
std::string_view docs;
std::string_view language;
std::optional<std::string_view> pubDate;
std::optional<std::string_view> lastBuildDate;
std::string_view pubDate;
std::string_view lastBuildDate;
image_t image;
std::string_view itunes_author;
std::string_view itunes_subtitle;
std::string_view itunes_summary;
std::string_view itunes_keywords;
std::string_view itunes_image;
std::optional<std::string_view> itunes_image;
std::string_view itunes_explicit;
std::string_view itunes_block;
std::optional<std::string_view> xmlns_feedburner;
std::string_view media_thumbnail;
std::string_view media_keywords;
std::string_view media_category;
itunes_owner_t itunes_owner;
std::vector<item_t> item;
std::string_view media_credit;
std::string_view media_rating;
std::string_view media_description;
};
REFLECTION(channel_t, title, link, description, generator, docs, language,
pubDate, lastBuildDate, itunes_author, itunes_subtitle,
pubDate, lastBuildDate, image, itunes_author, itunes_subtitle,
itunes_summary, itunes_keywords, itunes_image, itunes_explicit,
itunes_block, xmlns_feedburner, media_thumbnail, media_keywords,
media_category, itunes_owner, item);
itunes_block, item, media_credit, media_rating, media_description);

struct rss_t {
channel_t channel;
Expand All @@ -97,13 +106,13 @@ struct goods_t {
};
REFLECTION(goods_t, id, sales, inventory, weight, price, rating, discount);
struct storeowner_t {
std::string name;
std::string telephone;
std::string_view name;
std::string_view telephone;
};
REFLECTION(storeowner_t, name, telephone);
struct store_t {
std::string name;
std::string address;
std::string_view name;
std::string_view address;
storeowner_t owner;
std::vector<goods_t> goods;
};
Expand Down
58 changes: 35 additions & 23 deletions benchmark/xml_benchmark.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include "../rapidxml/rapidxml.hpp"
#include "xml_bench.hpp"

class ScopedTimer {
Expand Down Expand Up @@ -39,59 +40,70 @@ std::string xml_file_content(const std::string &filename) {
file.read(content.data(), content.size());
return content;
}
const int iterations = 1000;
void bench_de_sample_filelists() {

void test_deserialize() {
int iterations = 1000;

std::cout << "============ deserialize rpm_filelists.xml ===============\n";
std::string xmlfilelist = xml_file_content("../data/rpm_filelists.xml");
{

ScopedTimer timer("test deserialize rpm_filelists.xml");
ScopedTimer timer("rapidxml fastest parse rpm_filelists.xml");
for (int i = 0; i < iterations; ++i) {
filelists_t filelist;
iguana::from_xml<rapidxml::parse_fastest>(filelist, xmlfilelist.data());
rapidxml::xml_document<> doc;
doc.parse<rapidxml::parse_fastest>(xmlfilelist.data());
}
}
std::cout << "============ deserialize sample_rss.xml ===============\n";
{
ScopedTimer timer("iguana_xml deserialize rpm_filelists.xml");
filelists_t filelist;
for (int i = 0; i < iterations; ++i) {
iguana::from_xml(filelist, xmlfilelist.begin(), xmlfilelist.end());
filelist.package.clear();
}
}
}

void bench_de_sample_rss() {
std::string xmlrss = xml_file_content("../data/sample_rss.xml");
{

ScopedTimer timer("test deserialize sample_rss.xml");
ScopedTimer timer("rapidxml fastest parse sample_rss.xml");
for (int i = 0; i < iterations; ++i) {
rapidxml::xml_document<> doc;
doc.parse<rapidxml::parse_fastest>(xmlrss.data());
}
}
{
ScopedTimer timer("iguana_xml deserialize sample_rss.xml");
rss_t rss;
for (int i = 0; i < iterations; ++i) {
rss_t rss;
iguana::from_xml<rapidxml::parse_fastest>(rss, xmlrss.data());
// assert(rss.channel.item.size() == 99);
iguana::from_xml(rss, xmlrss.begin(), xmlrss.end());
rss.channel.item.clear();
}
}
}

void bench_num() {
int iterations = 1000;
std::cout << "============ deserialize bench_num.xml ===============\n";
std::string xmlnum = xml_file_content("../data/bench_num.xml");
{
ScopedTimer timer("test deserialize bench_num.xml");
ScopedTimer timer("iguana_xml deserialize bench_num.xml");
for (int i = 0; i < iterations; ++i) {
store_t s;
iguana::from_xml<rapidxml::parse_fastest>(s, xmlnum.data());
iguana::from_xml(s, xmlnum);
}
}
std::cout << "============ serialize bench_num.xml ===============\n";
store_t store;
iguana::from_xml<rapidxml::parse_fastest>(store, xmlnum.data());
iguana::from_xml(store, xmlnum);
std::string ss;
ss.reserve(xmlnum.size());
{
ScopedTimer timer("test serialize bench_num.xml");
ScopedTimer timer("iguana_xml serialize bench_num.xml");
for (int i = 0; i < iterations; ++i) {
iguana::to_xml(store, ss);
ss.clear();
}
}
}

int main() {
test_deserialize();
bench_num();
bench_de_sample_filelists();
bench_de_sample_rss();
// bench_num();
}
Loading

0 comments on commit 369fcd0

Please sign in to comment.