From b5b58149a04fc17f3ad76f1885d8484474bf49b1 Mon Sep 17 00:00:00 2001 From: "Simone.Angeloni" Date: Wed, 28 Nov 2018 12:19:19 +0000 Subject: [PATCH 1/6] Added samples using POCO C++ library --- Readme.md | 1 + bootstrap.sh | 23 +++++- .../cpp/poco-default_json_impl/CMakeLists.txt | 12 +++ samples/cpp/poco-default_json_impl/main.cpp | 71 +++++++++++++++++ samples/cpp/poco-rapidjson/CMakeLists.txt | 14 ++++ samples/cpp/poco-rapidjson/main.cpp | 76 +++++++++++++++++++ 6 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 samples/cpp/poco-default_json_impl/CMakeLists.txt create mode 100644 samples/cpp/poco-default_json_impl/main.cpp create mode 100644 samples/cpp/poco-rapidjson/CMakeLists.txt create mode 100644 samples/cpp/poco-rapidjson/main.cpp diff --git a/Readme.md b/Readme.md index 771f44b..59948e9 100644 --- a/Readme.md +++ b/Readme.md @@ -22,6 +22,7 @@ There are several implementations of HTTP server: - C++ : [cpprestsdk](https://github.com/Microsoft/cpprestsdk) - C++ : [restbed](https://github.com/corvusoft/restbed) - C++ : [pistache](https://github.com/oktal/pistache) +- C++ : [poco](https://github.com/pocoproject/poco) - PHP : Native implementation # Benchmark diff --git a/bootstrap.sh b/bootstrap.sh index 109cfd4..6b0d851 100644 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -54,10 +54,10 @@ EOF sudo apt-get install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages libcpprest-dev # Install RapidJSON library -# RapidJSON is required for pistache and restbed samples to produce JSON result +# RapidJSON is required for pistache, restbed and POCO samples to produce JSON result cd /tmp/build-libs -git clone https://github.com/miloyip/rapidjson +git clone https://github.com/Tencent/rapidjson.git cd rapidjson git submodule update --init cmake -DCMAKE_BUILD_TYPE=Release . @@ -85,6 +85,17 @@ sudo make install sudo cp -r distribution/library/* /usr/lib/ sudo cp -r distribution/include/* /usr/include/ +# Install POCO C++ framework + +cd /tmp/build-libs +git clone https://github.com/pocoproject/poco.git +cd poco +mkdir cmake_build +cd cmake_build +cmake -DCMAKE_BUILD_TYPE=Release .. +make +sudo make install + cat << EOF |-----------------------------------| | | @@ -108,3 +119,11 @@ make cd /vagrant/cpp/restbed cmake -DCMAKE_BUILD_TYPE=Release . make + +cd /vagrant/cpp/poco-default_json_impl +cmake -DCMAKE_BUILD_TYPE=Release . +make + +cd /vagrant/cpp/poco-rapidjson +cmake -DCMAKE_BUILD_TYPE=Release . +make diff --git a/samples/cpp/poco-default_json_impl/CMakeLists.txt b/samples/cpp/poco-default_json_impl/CMakeLists.txt new file mode 100644 index 0000000..2cd19a0 --- /dev/null +++ b/samples/cpp/poco-default_json_impl/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.5) +project(main) + +find_package(Poco REQUIRED COMPONENTS Foundation Net JSON Util) + +add_executable(main main.cpp) +target_link_libraries(main + Poco::Foundation + Poco::Net + Poco::JSON + Poco::Util +) diff --git a/samples/cpp/poco-default_json_impl/main.cpp b/samples/cpp/poco-default_json_impl/main.cpp new file mode 100644 index 0000000..f094b35 --- /dev/null +++ b/samples/cpp/poco-default_json_impl/main.cpp @@ -0,0 +1,71 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class HelloRequestHandler : public Poco::Net::HTTPRequestHandler +{ +public: + virtual void handleRequest(Poco::Net::HTTPServerRequest &req, Poco::Net::HTTPServerResponse &resp) + { + resp.setStatus(Poco::Net::HTTPResponse::HTTP_OK); + + char _id[20]; + Poco::JSON::Array JSONArray; + + for (int i = 0; i < 10000; ++i) + { + Poco::JSON::Object::Ptr JSONObject = new Poco::JSON::Object(true); + + snprintf(_id, sizeof(_id), "item-%d", i); + JSONObject->set("id", _id); + JSONObject->set("name", "Hello World"); + JSONObject->set("type", "application"); + + JSONArray.add(Poco::Dynamic::Var(JSONObject)); + } + + std::ostream& out = resp.send(); + JSONArray.stringify(out); + out.flush(); + } +}; + +class HelloRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory +{ +public: + virtual Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest &) + { + return new HelloRequestHandler; + } +}; + +class HelloServerApp : public Poco::Util::ServerApplication +{ +protected: + int main(const std::vector &) + { + Poco::Net::ServerSocket socket(Poco::Net::SocketAddress(Poco::Net::AddressFamily::IPv4, 9000)); + Poco::Net::HTTPServer s(new HelloRequestHandlerFactory, socket, new Poco::Net::HTTPServerParams); + + s.start(); + waitForTerminationRequest(); + s.stop(); + + return Application::EXIT_OK; + } +}; + +int main(int argc, char** argv) +{ + HelloServerApp app; + return app.run(argc, argv); +} diff --git a/samples/cpp/poco-rapidjson/CMakeLists.txt b/samples/cpp/poco-rapidjson/CMakeLists.txt new file mode 100644 index 0000000..711c826 --- /dev/null +++ b/samples/cpp/poco-rapidjson/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.5) +project(main) + +find_package(Poco REQUIRED COMPONENTS Foundation Net JSON Util) +find_package(RapidJSON REQUIRED) + +add_executable(main main.cpp) +target_include_directories(main PUBLIC ${RAPIDJSON_INCLUDE_DIRS}) +target_link_libraries(main + Poco::Foundation + Poco::Net + Poco::JSON + Poco::Util +) diff --git a/samples/cpp/poco-rapidjson/main.cpp b/samples/cpp/poco-rapidjson/main.cpp new file mode 100644 index 0000000..e40d06e --- /dev/null +++ b/samples/cpp/poco-rapidjson/main.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class HelloRequestHandler : public Poco::Net::HTTPRequestHandler +{ +public: + virtual void handleRequest(Poco::Net::HTTPServerRequest &req, Poco::Net::HTTPServerResponse &resp) + { + resp.setStatus(Poco::Net::HTTPResponse::HTTP_OK); + + char _id[20]; + + rapidjson::StringBuffer JSONBuffer; + rapidjson::Writer JSONWriter(JSONBuffer); + JSONWriter.StartArray(); + + for (int i = 0; i < 10000; ++i) + { + JSONWriter.StartObject(); + + snprintf(_id, sizeof(_id), "item-%d", i); + JSONWriter.Key("id"); JSONWriter.String(_id); + JSONWriter.Key("name"); JSONWriter.String("Hello World"); + JSONWriter.Key("type"); JSONWriter.String("application"); + + JSONWriter.EndObject(); + } + + JSONWriter.EndArray(); + + std::ostream& out = resp.send(); + out << JSONBuffer.GetString(); + out.flush(); + } +}; + +class HelloRequestHandlerFactory : public Poco::Net::HTTPRequestHandlerFactory +{ +public: + virtual Poco::Net::HTTPRequestHandler* createRequestHandler(const Poco::Net::HTTPServerRequest &) + { + return new HelloRequestHandler; + } +}; + +class HelloServerApp : public Poco::Util::ServerApplication +{ +protected: + int main(const std::vector &) + { + Poco::Net::ServerSocket socket(Poco::Net::SocketAddress(Poco::Net::AddressFamily::IPv4, 9000)); + Poco::Net::HTTPServer s(new HelloRequestHandlerFactory, socket, new Poco::Net::HTTPServerParams); + + s.start(); + waitForTerminationRequest(); + s.stop(); + + return Application::EXIT_OK; + } +}; + +int main(int argc, char** argv) +{ + HelloServerApp app; + return app.run(argc, argv); +} From 8483c3fec063c998be3c1e26c26874b2338e04ce Mon Sep 17 00:00:00 2001 From: simone Date: Sun, 3 Feb 2019 23:45:06 +0000 Subject: [PATCH 2/6] Minor improvements to the script and changes to compile under Linux --- .gitignore | 1 + bootstrap.sh | 65 +++++++++++++-------- samples/cpp/poco-default_json_impl/main.cpp | 5 +- 3 files changed, 43 insertions(+), 28 deletions(-) create mode 100644 .gitignore mode change 100644 => 100755 bootstrap.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a6fb78b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build-libs/ diff --git a/bootstrap.sh b/bootstrap.sh old mode 100644 new mode 100755 index 6b0d851..c53bbf6 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -10,7 +10,7 @@ EOF # Install build tools and ntp (to prevent clock skewing) -sudo mkdir /tmp/build-libs +mkdir build-libs sudo apt-get install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages ntp cmake # Replace nginx configuration @@ -56,45 +56,48 @@ sudo apt-get install -y --allow-downgrades --allow-remove-essential --allow-chan # Install RapidJSON library # RapidJSON is required for pistache, restbed and POCO samples to produce JSON result -cd /tmp/build-libs +pushd build-libs git clone https://github.com/Tencent/rapidjson.git -cd rapidjson +pushd rapidjson git submodule update --init cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 sudo make install +popd # Install Pistache C++ REST framework -cd /tmp/build-libs git clone https://github.com/oktal/pistache.git -cd pistache +pushd pistache git submodule update --init cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 sudo make install +popd # Install Restbed C++ REST framework -cd /tmp/build-libs git clone --recursive https://github.com/corvusoft/restbed.git -cd restbed +pushd restbed cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 sudo make install sudo cp -r distribution/library/* /usr/lib/ sudo cp -r distribution/include/* /usr/include/ +popd # Install POCO C++ framework -cd /tmp/build-libs git clone https://github.com/pocoproject/poco.git -cd poco +pushd poco mkdir cmake_build cd cmake_build cmake -DCMAKE_BUILD_TYPE=Release .. -make +make -j 8 sudo make install +popd + +popd cat << EOF |-----------------------------------| @@ -104,26 +107,38 @@ cat << EOF |-----------------------------------| EOF -cd /vagrant/cpp/cpprestsdk-default_json_impl +ls +pushd samples/cpp + +pushd cpprestsdk-default_json_impl cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 +popd -cd /vagrant/cpp/cpprestsdk-rapidjson +pushd cpprestsdk-rapidjson cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 +popd -cd /vagrant/cpp/pistache +pushd pistache cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 +popd -cd /vagrant/cpp/restbed +pushd restbed cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 +popd -cd /vagrant/cpp/poco-default_json_impl +pushd poco-default_json_impl cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 +popd -cd /vagrant/cpp/poco-rapidjson +pushd poco-rapidjson cmake -DCMAKE_BUILD_TYPE=Release . -make +make -j 8 +popd + +popd + diff --git a/samples/cpp/poco-default_json_impl/main.cpp b/samples/cpp/poco-default_json_impl/main.cpp index f094b35..5f99b0f 100644 --- a/samples/cpp/poco-default_json_impl/main.cpp +++ b/samples/cpp/poco-default_json_impl/main.cpp @@ -18,15 +18,14 @@ class HelloRequestHandler : public Poco::Net::HTTPRequestHandler { resp.setStatus(Poco::Net::HTTPResponse::HTTP_OK); - char _id[20]; Poco::JSON::Array JSONArray; for (int i = 0; i < 10000; ++i) { Poco::JSON::Object::Ptr JSONObject = new Poco::JSON::Object(true); - snprintf(_id, sizeof(_id), "item-%d", i); - JSONObject->set("id", _id); + std::string id("item-"); id += std::to_string(i); + JSONObject->set("id", id); JSONObject->set("name", "Hello World"); JSONObject->set("type", "application"); From 71774bf152483df3f03d8b2ffef505ba9cb725fe Mon Sep 17 00:00:00 2001 From: Simone Angeloni Date: Sun, 3 Feb 2019 23:47:44 +0000 Subject: [PATCH 3/6] Update bootstrap.sh --- bootstrap.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bootstrap.sh b/bootstrap.sh index c53bbf6..c18acaa 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -57,6 +57,7 @@ sudo apt-get install -y --allow-downgrades --allow-remove-essential --allow-chan # RapidJSON is required for pistache, restbed and POCO samples to produce JSON result pushd build-libs + git clone https://github.com/Tencent/rapidjson.git pushd rapidjson git submodule update --init @@ -107,7 +108,6 @@ cat << EOF |-----------------------------------| EOF -ls pushd samples/cpp pushd cpprestsdk-default_json_impl From ea3781144063b0a2d9d8abb46f2fe4533bcb151f Mon Sep 17 00:00:00 2001 From: Simone Angeloni Date: Sun, 3 Feb 2019 23:49:25 +0000 Subject: [PATCH 4/6] !A benchmarks for POCO implementations --- results/benchmark-poco-default_json_impl.png | Bin 0 -> 32416 bytes results/benchmark-poco-rapidjson.png | Bin 0 -> 31510 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 results/benchmark-poco-default_json_impl.png create mode 100644 results/benchmark-poco-rapidjson.png diff --git a/results/benchmark-poco-default_json_impl.png b/results/benchmark-poco-default_json_impl.png new file mode 100644 index 0000000000000000000000000000000000000000..30295f5669ca91f170b228d65e8159ae74d7c645 GIT binary patch literal 32416 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 QC%8pl$M{C+wYyLMA1zk%m;e9( literal 0 HcmV?d00001 diff --git a/results/benchmark-poco-rapidjson.png b/results/benchmark-poco-rapidjson.png new file mode 100644 index 0000000000000000000000000000000000000000..a513da4dd33383f989bab3c390f5b48d337aa8b5 GIT binary patch literal 31510 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 literal 0 HcmV?d00001 From d1e45d4b71ad837860cc337cd6e13d0fee1f1143 Mon Sep 17 00:00:00 2001 From: Simone Angeloni Date: Sun, 3 Feb 2019 23:55:04 +0000 Subject: [PATCH 5/6] Update Readme.md --- Readme.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Readme.md b/Readme.md index 59948e9..3add284 100644 --- a/Readme.md +++ b/Readme.md @@ -85,6 +85,24 @@ Benchmark was done by running `ab -n 1000 -c 1 -k ` (see [Apache Benchmark] (-) Unit tests are ill-formed. +## POCO + +#### Benchmark results for default JSON implementation on Linux + +![poco benchmark results](https://raw.githubusercontent.com/metamaker/cpp-rest-frameworks-benchmark/master/results/benchmark-poco-default_json_impl.png) + +#### Benchmark results with RapidJSON on Linux + +![poco benchmark results](https://raw.githubusercontent.com/metamaker/cpp-rest-frameworks-benchmark/master/results/benchmark-poco-rapidjson.png) + +(+) POCO has its own implementation of JSON serializer/deserializer, so you don't need to additionally include RapidJSON or other library, however the default implementation is much slower than the one using RapidJSON. + +(+) Inline code documentation. + +(-) No comprehensive list of implemented features. + +(+) Licensed under Boost software License. + ## PHP native implementation ![PHP native implementation benchmark results](https://raw.githubusercontent.com/metamaker/cpp-rest-frameworks-benchmark/master/results/benchmark-php.png) From c9fa446cc65164f7ccd5f1d2f685d6b97565097f Mon Sep 17 00:00:00 2001 From: Simone Angeloni Date: Mon, 4 Feb 2019 08:24:44 +0000 Subject: [PATCH 6/6] Update Readme.md --- Readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index 3add284..f289ee1 100644 --- a/Readme.md +++ b/Readme.md @@ -89,11 +89,11 @@ Benchmark was done by running `ab -n 1000 -c 1 -k ` (see [Apache Benchmark] #### Benchmark results for default JSON implementation on Linux -![poco benchmark results](https://raw.githubusercontent.com/metamaker/cpp-rest-frameworks-benchmark/master/results/benchmark-poco-default_json_impl.png) +![poco benchmark results](https://github.com/sineang01/cpp-rest-frameworks-benchmark/blob/master/results/benchmark-poco-default_json_impl.png) #### Benchmark results with RapidJSON on Linux -![poco benchmark results](https://raw.githubusercontent.com/metamaker/cpp-rest-frameworks-benchmark/master/results/benchmark-poco-rapidjson.png) +![poco benchmark results](https://github.com/sineang01/cpp-rest-frameworks-benchmark/blob/master/results/benchmark-poco-rapidjson.png) (+) POCO has its own implementation of JSON serializer/deserializer, so you don't need to additionally include RapidJSON or other library, however the default implementation is much slower than the one using RapidJSON.