From 214c67788f99c63ab4081b350eee81a7b54bb528 Mon Sep 17 00:00:00 2001 From: gabime Date: Sun, 18 Sep 2016 01:51:53 +0300 Subject: [PATCH] add async with null sink bench --- bench/Makefile | 7 ++- bench/spdlog-null-async.cpp | 112 ++++++++++++++++++++++++++++++++++++ bench/utils.h | 35 +++++++++++ 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 bench/spdlog-null-async.cpp create mode 100644 bench/utils.h diff --git a/bench/Makefile b/bench/Makefile index ea2220b9..fa787d18 100644 --- a/bench/Makefile +++ b/bench/Makefile @@ -3,7 +3,7 @@ CXXFLAGS = -march=native -Wall -Wextra -pedantic -std=c++11 -pthread -Wl,--no-as CXX_RELEASE_FLAGS = -O3 -flto -DNDEBUG -binaries=spdlog-bench spdlog-bench-mt spdlog-async boost-bench boost-bench-mt glog-bench glog-bench-mt g2log-async easylogging-bench easylogging-bench-mt +binaries=spdlog-bench spdlog-bench-mt spdlog-async spdlog-null-async boost-bench boost-bench-mt glog-bench glog-bench-mt g2log-async easylogging-bench easylogging-bench-mt all: $(binaries) @@ -17,6 +17,11 @@ spdlog-async: spdlog-async.cpp $(CXX) spdlog-async.cpp -o spdlog-async $(CXXFLAGS) $(CXX_RELEASE_FLAGS) +spdlog-null-async: spdlog-null-async.cpp + $(CXX) spdlog-null-async.cpp -o spdlog-null-async $(CXXFLAGS) $(CXX_RELEASE_FLAGS) + + + BOOST_FLAGS = -DBOOST_LOG_DYN_LINK -I/usr/include -lboost_log -lboost_log_setup -lboost_filesystem -lboost_system -lboost_thread -lboost_regex -lboost_date_time -lboost_chrono boost-bench: boost-bench.cpp diff --git a/bench/spdlog-null-async.cpp b/bench/spdlog-null-async.cpp new file mode 100644 index 00000000..435d7eb5 --- /dev/null +++ b/bench/spdlog-null-async.cpp @@ -0,0 +1,112 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +// +// bench.cpp : spdlog benchmarks +// +#include +#include // EXIT_FAILURE +#include +#include +#include +#include +#include "spdlog/spdlog.h" +#include "spdlog/async_logger.h" +#include "spdlog/sinks/null_sink.h" +#include "utils.h" + + +using namespace std; +using namespace std::chrono; +using namespace spdlog; +using namespace spdlog::sinks; +using namespace utils; + + + +size_t bench_as(int howmany, std::shared_ptr log, int thread_count); + +int main(int argc, char* argv[]) +{ + + int queue_size = 1048576; + int howmany = 1000000; + int threads = 10; + int iters = 10; + + try + { + + if(argc > 1) + howmany = atoi(argv[1]); + if (argc > 2) + threads = atoi(argv[2]); + if (argc > 3) + queue_size = atoi(argv[3]); + + + cout << "\n*******************************************************************************\n"; + cout << "async logging.. " << threads << " threads sharing same logger, " << format(howmany) << " messages " << endl; + cout << "*******************************************************************************\n"; + + spdlog::set_async_mode(queue_size); + + size_t total_rate = 0; + + for(int i = 0; i < iters; ++i) + { + //auto as = spdlog::daily_logger_st("as", "logs/daily_async"); + auto as = spdlog::create("async(null-sink)"); + total_rate+= bench_as(howmany, as, threads); + spdlog::drop("async(null-sink)"); + } + std::cout << endl; + std::cout << "Avg rate: " << format(total_rate/iters) << "/sec" < log, int thread_count) +{ + cout << log->name() << "...\t\t" << flush; + std::atomic msg_counter {0}; + vector threads; + auto start = system_clock::now(); + for (int t = 0; t < thread_count; ++t) + { + threads.push_back(std::thread([&]() + { + for(;;) + { + int counter = ++msg_counter; + if (counter > howmany) break; + log->info("Hello logger: msg number {}", counter); + } + })); + } + + + for(auto &t:threads) + { + t.join(); + }; + + + auto delta = system_clock::now() - start; + auto delta_d = duration_cast> (delta).count(); + auto per_sec = size_t(howmany / delta_d); + cout << format(per_sec) << "/sec" << endl; + return per_sec; +} diff --git a/bench/utils.h b/bench/utils.h new file mode 100644 index 00000000..b260f724 --- /dev/null +++ b/bench/utils.h @@ -0,0 +1,35 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#include +#include +#include + +namespace utils +{ + +template +inline std::string format(const T& value) +{ + static std::locale loc(""); + std::stringstream ss; + ss.imbue(loc); + ss << value; + return ss.str(); +} + +template<> +inline std::string format(const double & value) +{ + static std::locale loc(""); + std::stringstream ss; + ss.imbue(loc); + ss << std::fixed << std::setprecision(1) << value; + return ss.str(); +} + +}