From 2132fe0ec5e4570100b951af51a52a361fb72afb Mon Sep 17 00:00:00 2001 From: "Kevin M. Godby" Date: Wed, 4 May 2016 22:46:30 -0500 Subject: [PATCH] Initial work on benchmarks of other logging systems. --- .gitmodules | 9 ++++ CMakeLists.txt | 6 +++ bench/CMakeLists.txt | 78 ++++++++++++++++++++++++++++++++++ bench/easylogging-bench-mt.cpp | 2 +- bench/easylogging-bench.cpp | 2 +- bench/zf_log-bench-mt.cpp | 4 +- bench/zf_log-bench.cpp | 4 +- vendor/CMakeLists.txt | 21 +++++++++ vendor/easyloggingpp | 1 + vendor/glog | 1 + vendor/zf_log | 1 + 11 files changed, 123 insertions(+), 6 deletions(-) create mode 100644 .gitmodules create mode 100644 bench/CMakeLists.txt create mode 100644 vendor/CMakeLists.txt create mode 160000 vendor/easyloggingpp create mode 160000 vendor/glog create mode 160000 vendor/zf_log diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..383c487a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,9 @@ +[submodule "vendor/zf_log"] + path = vendor/zf_log + url = https://github.com/wonder-mice/zf_log.git +[submodule "vendor/glog"] + path = vendor/glog + url = https://github.com/google/glog.git +[submodule "vendor/easyloggingpp"] + path = vendor/easyloggingpp + url = https://github.com/easylogging/easyloggingpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 25f2ebcf..4c85f7ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ add_library(spdlog INTERFACE) option(SPDLOG_BUILD_EXAMPLES "Build examples" OFF) option(SPDLOG_BUILD_TESTS "Build tests" OFF) +option(SPDLOG_BUILD_BENCHMARKS "Build comparison benchmarks for various logging libraries" OFF) target_include_directories( spdlog @@ -32,6 +33,11 @@ if(SPDLOG_BUILD_TESTS) add_subdirectory(tests) endif() +if(SPDLOG_BUILD_BENCHMARKS) + add_subdirectory(vendor) + add_subdirectory(bench) +endif() + ### Install ### # * https://github.com/forexample/package-example set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt new file mode 100644 index 00000000..d3506081 --- /dev/null +++ b/bench/CMakeLists.txt @@ -0,0 +1,78 @@ +# +# Benchmarks against various logging systems +# + +# +# Dependencies +# + +find_package(Threads) + +enable_testing() + +# Helper function for building benchmark programs +function(add_benchmark _target) + set(options "") # no options + set(singleValueArgs "") # no single-value arguments + set(multiValueArgs LIBS SOURCES INCLUDES DEFINITIONS) # lists of additional libraries, source files, and include directories + cmake_parse_arguments(_benchmark "${options}" "${singleValueArgs}" "${multiValueArgs}" ${ARGN}) + + add_executable(${_target} ${_target}.cpp ${_benchmark_SOURCES}) + target_include_directories( + ${_target} + PUBLIC + ${HEADER_BASE} + ${_benchmark_INCLUDES} + ) + + target_link_libraries( + ${_target} + ${CMAKE_THREAD_LIBS_INIT} + ${_benchmark_LIBS} + ) + + if(_benchmark_DEFINITIONS) + target_compile_definitions(${_target} ${_benchmark_DEFINITIONS}) + endif() + + add_test(NAME test_benchmark_${_target} COMMAND ${_target}) +endfunction() + +# Benchmark programs +add_benchmark(spdlog-bench) +add_benchmark(spdlog-bench-mt) +add_benchmark(spdlog-async) + +if(TARGET zf_log) + add_benchmark(zf_log-bench LIBS zf_log) + add_benchmark(zf_log-bench-mt LIBS zf_log) +endif() + +find_package(Boost QUIET COMPONENTS log) +if(Boost_FOUND) + add_benchmark(boost-bench LIBS ${Boost_LIBRARIES} INCLUDES ${Boost_INCLUDE_DIRS}) + add_benchmark(boost-bench-mt LIBS ${Boost_LIBRARIES} INCLUDES ${Boost_INCLUDE_DIRS}) +endif() + +find_package(glog QUIET) +if(TARGET glog) + add_benchmark(glog-bench LIBS glog) + add_benchmark(glog-bench-mt LIBS glog) +endif() + +# TODO make g2log find script +# TODO use g2log git submodule +find_package(g2log QUIET) +if(g2log-FOUND) + set(G2LOG_LIBRARIES lib_g2logger) + set(G2LOG_INCLUDE_DIRS /home/gabi/devel/g2log/g2log/src) + add_benchmark(g2log-async LIBS ${G2LOG_LIBRARIES} INCLUDES ${G2LOG_INCLUDE_DIRS}) +endif() + +if(TARGET easylogging) + add_benchmark(easylogging-bench LIBS easylogging) + add_benchmark(easylogging-bench-mt LIBS easylogging) +endif() + +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/logs") + diff --git a/bench/easylogging-bench-mt.cpp b/bench/easylogging-bench-mt.cpp index 98d1ae35..18d81618 100644 --- a/bench/easylogging-bench-mt.cpp +++ b/bench/easylogging-bench-mt.cpp @@ -9,7 +9,7 @@ #define _ELPP_THREAD_SAFE #include "easylogging++.h" -_INITIALIZE_EASYLOGGINGPP +INITIALIZE_EASYLOGGINGPP using namespace std; diff --git a/bench/easylogging-bench.cpp b/bench/easylogging-bench.cpp index a952cbd5..fa20032e 100644 --- a/bench/easylogging-bench.cpp +++ b/bench/easylogging-bench.cpp @@ -6,7 +6,7 @@ #include "easylogging++.h" -_INITIALIZE_EASYLOGGINGPP +INITIALIZE_EASYLOGGINGPP int main(int, char* []) { diff --git a/bench/zf_log-bench-mt.cpp b/bench/zf_log-bench-mt.cpp index aace2770..12cb48ac 100644 --- a/bench/zf_log-bench-mt.cpp +++ b/bench/zf_log-bench-mt.cpp @@ -9,7 +9,7 @@ const char g_path[] = "logs/zf_log.txt"; int g_fd; -static void output_callback(zf_log_message *msg) +static void output_callback(const zf_log_message* msg, void* arg) { *msg->p = '\n'; write(g_fd, msg->buf, msg->p - msg->buf + 1); @@ -25,7 +25,7 @@ int main(int argc, char* argv[]) ZF_LOGE_AUX(ZF_LOG_STDERR, "Failed to open log file: %s", g_path); return -1; } - zf_log_set_output_callback(ZF_LOG_PUT_STD, output_callback); + ZF_LOG_DEFINE_GLOBAL_OUTPUT = {ZF_LOG_PUT_STD, nullptr, &output_callback}; int thread_count = 10; if(argc > 1) diff --git a/bench/zf_log-bench.cpp b/bench/zf_log-bench.cpp index a6e3e1ff..d6024cf5 100644 --- a/bench/zf_log-bench.cpp +++ b/bench/zf_log-bench.cpp @@ -4,7 +4,7 @@ const char g_path[] = "logs/zf_log.txt"; static FILE *g_f; -static void output_callback(zf_log_message *msg) +static void output_callback(const zf_log_message* msg, void* arg) { *msg->p = '\n'; fwrite(msg->buf, msg->p - msg->buf + 1, 1, g_f); @@ -18,7 +18,7 @@ int main(int, char* []) ZF_LOGE_AUX(ZF_LOG_STDERR, "Failed to open log file: %s", g_path); return -1; } - zf_log_set_output_callback(ZF_LOG_PUT_STD, output_callback); + ZF_LOG_DEFINE_GLOBAL_OUTPUT = {ZF_LOG_PUT_STD, nullptr, &output_callback}; const int howmany = 1000000; for(int i = 0 ; i < howmany; ++i) diff --git a/vendor/CMakeLists.txt b/vendor/CMakeLists.txt new file mode 100644 index 00000000..b2abdde4 --- /dev/null +++ b/vendor/CMakeLists.txt @@ -0,0 +1,21 @@ +# +# External libraries +# +# +# Most of these libraries are used for running comparison benchmarks against +# other logging libraries. + +add_subdirectory(zf_log) + +#add_subdirectory(glog) + +add_library(easylogging INTERFACE) +set(SPDLOG_VENDORED_EASYLOGGING_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/easyloggingpp" CACHE INTERNAL "" FORCE) +target_include_directories(easylogging INTERFACE "${SPDLOG_VENDORED_EASYLOGGING_ROOT}/src") + +#add_library(zflog INTERFACE) +#set(SPDLOG_VENDORED_ZFLOG_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/zf_log" CACHE INTERNAL "" FORCE) +#target_include_directories(zflog INTERFACE "${SPDLOG_VENDORED_ZFLOG_ROOT}/zf_log") +##target_compile_definitions(zflog INTERFACE ZFLOG_DEFINITIONS) + + diff --git a/vendor/easyloggingpp b/vendor/easyloggingpp new file mode 160000 index 00000000..f926802d --- /dev/null +++ b/vendor/easyloggingpp @@ -0,0 +1 @@ +Subproject commit f926802dfbde716d82b64b8ef3c25b7f0fcfec65 diff --git a/vendor/glog b/vendor/glog new file mode 160000 index 00000000..de6149ef --- /dev/null +++ b/vendor/glog @@ -0,0 +1 @@ +Subproject commit de6149ef8e67b064a433a8b88924fa9f606ad5d5 diff --git a/vendor/zf_log b/vendor/zf_log new file mode 160000 index 00000000..4c15e670 --- /dev/null +++ b/vendor/zf_log @@ -0,0 +1 @@ +Subproject commit 4c15e6704edffdafe289d4b84c2db89009368626