Merge commit 'a4163d8b1b2f6c012c0e1d26f90815879a743aa8' as 'vendor/spdlog'
This commit is contained in:
		
							
								
								
									
										62
									
								
								vendor/spdlog/bench/Makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								vendor/spdlog/bench/Makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| CXX	?= g++ | ||||
| CXXFLAGS	= -march=native -Wall -Wextra -pedantic -std=c++11 -pthread -I../include | ||||
| CXX_RELEASE_FLAGS = -O3 -flto -DNDEBUG | ||||
|  | ||||
|  | ||||
| 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) | ||||
|  | ||||
| spdlog-bench: spdlog-bench.cpp | ||||
| 	$(CXX) spdlog-bench.cpp -o spdlog-bench $(CXXFLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| spdlog-bench-mt: spdlog-bench-mt.cpp | ||||
| 	$(CXX) spdlog-bench-mt.cpp -o spdlog-bench-mt  $(CXXFLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| 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 | ||||
| 	$(CXX) boost-bench.cpp -o boost-bench $(CXXFLAGS) $(BOOST_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| boost-bench-mt: boost-bench-mt.cpp | ||||
| 	$(CXX) boost-bench-mt.cpp -o boost-bench-mt $(CXXFLAGS) $(BOOST_FLAGS) $(CXX_RELEASE_FLAGS)	 | ||||
|  | ||||
|  | ||||
| GLOG_FLAGS = -lglog | ||||
| glog-bench: glog-bench.cpp | ||||
| 	$(CXX) glog-bench.cpp -o glog-bench $(CXXFLAGS) $(GLOG_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| glog-bench-mt: glog-bench-mt.cpp | ||||
| 	$(CXX) glog-bench-mt.cpp -o glog-bench-mt $(CXXFLAGS) $(GLOG_FLAGS) $(CXX_RELEASE_FLAGS)	 | ||||
|  | ||||
|  | ||||
| G2LOG_FLAGS = -I/home/gabi/devel/g2log/g2log/src -L/home/gabi/devel/g2log/g2log -llib_g2logger  | ||||
| g2log-async: g2log-async.cpp | ||||
| 	$(CXX) g2log-async.cpp -o g2log-async $(CXXFLAGS) $(G2LOG_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
|  | ||||
| EASYL_FLAGS = -I../../easylogging/src/ | ||||
| easylogging-bench: easylogging-bench.cpp | ||||
| 	$(CXX) easylogging-bench.cpp -o easylogging-bench $(CXXFLAGS) $(EASYL_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| easylogging-bench-mt: easylogging-bench-mt.cpp | ||||
| 	$(CXX) easylogging-bench-mt.cpp -o easylogging-bench-mt $(CXXFLAGS) $(EASYL_FLAGS) $(CXX_RELEASE_FLAGS)	 | ||||
| 	 | ||||
| .PHONY: clean | ||||
|  | ||||
| clean: | ||||
| 	rm -f *.o logs/* $(binaries) | ||||
|  | ||||
|  | ||||
| rebuild: clean all | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										57
									
								
								vendor/spdlog/bench/Makefile.mingw
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/spdlog/bench/Makefile.mingw
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| CXX	?= g++ | ||||
| CXXFLAGS	= -D_WIN32_WINNT=0x600 -march=native -Wall -Wextra -pedantic -std=c++11 -pthread -Wl,--no-as-needed  -I../include  | ||||
| CXX_RELEASE_FLAGS = -O3 -flto | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
| all: $(binaries) | ||||
|  | ||||
| spdlog-bench: spdlog-bench.cpp | ||||
| 	$(CXX) spdlog-bench.cpp -o spdlog-bench $(CXXFLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| spdlog-bench-mt: spdlog-bench-mt.cpp | ||||
| 	$(CXX) spdlog-bench-mt.cpp -o spdlog-bench-mt  $(CXXFLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| spdlog-async: spdlog-async.cpp | ||||
| 	$(CXX) spdlog-async.cpp -o spdlog-async  $(CXXFLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
|  | ||||
| BOOST_FLAGS	= -DBOOST_LOG_DYN_LINK  -I/home/gabi/devel/boost_1_56_0/ -L/home/gabi/devel/boost_1_56_0/stage/lib -lboost_log  -lboost_log_setup -lboost_filesystem -lboost_system -lboost_thread -lboost_regex -lboost_date_time -lboost_chrono	 | ||||
|  | ||||
| boost-bench: boost-bench.cpp | ||||
| 	$(CXX) boost-bench.cpp -o boost-bench $(CXXFLAGS) $(BOOST_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| boost-bench-mt: boost-bench-mt.cpp | ||||
| 	$(CXX) boost-bench-mt.cpp -o boost-bench-mt $(CXXFLAGS) $(BOOST_FLAGS) $(CXX_RELEASE_FLAGS)	 | ||||
|  | ||||
|  | ||||
| GLOG_FLAGS = -lglog | ||||
| glog-bench: glog-bench.cpp | ||||
| 	$(CXX) glog-bench.cpp -o glog-bench $(CXXFLAGS) $(GLOG_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
| glog-bench-mt: glog-bench-mt.cpp | ||||
| 	$(CXX) glog-bench-mt.cpp -o glog-bench-mt $(CXXFLAGS) $(GLOG_FLAGS) $(CXX_RELEASE_FLAGS)	 | ||||
|  | ||||
|  | ||||
| G2LOG_FLAGS = -I/home/gabi/devel/g2log/g2log/src -L/home/gabi/devel/g2log/g2log -llib_g2logger  | ||||
| g2log-async: g2log-async.cpp | ||||
| 	$(CXX) g2log-async.cpp -o g2log-async $(CXXFLAGS) $(G2LOG_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| 	 | ||||
|  | ||||
| EASYL_FLAGS = -I../../easylogging/src/ | ||||
| easylogging-bench: easylogging-bench.cpp | ||||
| 	$(CXX) easylogging-bench.cpp -o easylogging-bench $(CXXFLAGS) $(EASYL_FLAGS) $(CXX_RELEASE_FLAGS) | ||||
| easylogging-bench-mt: easylogging-bench-mt.cpp | ||||
| 	$(CXX) easylogging-bench-mt.cpp -o easylogging-bench-mt $(CXXFLAGS) $(EASYL_FLAGS) $(CXX_RELEASE_FLAGS)	 | ||||
| 	 | ||||
| .PHONY: clean | ||||
|  | ||||
| clean: | ||||
| 	rm -f *.o logs/* $(binaries) | ||||
|  | ||||
|  | ||||
| rebuild: clean all | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										84
									
								
								vendor/spdlog/bench/boost-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								vendor/spdlog/bench/boost-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
|  | ||||
| #include <boost/log/core.hpp> | ||||
| #include <boost/log/trivial.hpp> | ||||
| #include <boost/log/expressions.hpp> | ||||
| #include <boost/log/sinks/text_file_backend.hpp> | ||||
| #include <boost/log/utility/setup/file.hpp> | ||||
| #include <boost/log/utility/setup/common_attributes.hpp> | ||||
| #include <boost/log/sources/severity_logger.hpp> | ||||
| #include <boost/log/sources/record_ostream.hpp> | ||||
|  | ||||
| namespace logging = boost::log; | ||||
| namespace src = boost::log::sources; | ||||
| namespace sinks = boost::log::sinks; | ||||
| namespace keywords = boost::log::keywords; | ||||
|  | ||||
| void init() | ||||
| { | ||||
|     logging::add_file_log | ||||
|     ( | ||||
|         keywords::file_name = "logs/boost-sample_%N.log",                              /*< file name pattern >*/ | ||||
|         keywords::auto_flush = false, | ||||
|         keywords::format = "[%TimeStamp%]: %Message%" | ||||
|     ); | ||||
|  | ||||
|     logging::core::get()->set_filter | ||||
|     ( | ||||
|         logging::trivial::severity >= logging::trivial::info | ||||
|     ); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|     int thread_count = 10; | ||||
|     if(argc > 1) | ||||
|         thread_count = atoi(argv[1]); | ||||
|  | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|  | ||||
|     init(); | ||||
|     logging::add_common_attributes(); | ||||
|  | ||||
|  | ||||
|     using namespace logging::trivial; | ||||
|  | ||||
|     src::severity_logger_mt< severity_level > lg; | ||||
|  | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     vector<thread> threads; | ||||
|  | ||||
|     for (int t = 0; t < thread_count; ++t) | ||||
|     { | ||||
|         threads.push_back(std::thread([&]() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 int counter = ++msg_counter; | ||||
|                 if (counter > howmany) break; | ||||
|                 BOOST_LOG_SEV(lg, info) << "boost message #" << counter << ": This is some text for your pleasure"; | ||||
|             } | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     for(auto &t:threads) | ||||
|     { | ||||
|         t.join(); | ||||
|     }; | ||||
|  | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										47
									
								
								vendor/spdlog/bench/boost-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								vendor/spdlog/bench/boost-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
| #include <boost/log/core.hpp> | ||||
| #include <boost/log/trivial.hpp> | ||||
| #include <boost/log/expressions.hpp> | ||||
| #include <boost/log/sinks/text_file_backend.hpp> | ||||
| #include <boost/log/utility/setup/file.hpp> | ||||
| #include <boost/log/utility/setup/common_attributes.hpp> | ||||
| #include <boost/log/sources/severity_logger.hpp> | ||||
| #include <boost/log/sources/record_ostream.hpp> | ||||
|  | ||||
| namespace logging = boost::log; | ||||
| namespace src = boost::log::sources; | ||||
| namespace sinks = boost::log::sinks; | ||||
| namespace keywords = boost::log::keywords; | ||||
|  | ||||
| void init() | ||||
| { | ||||
|     logging::add_file_log | ||||
|     ( | ||||
|         keywords::file_name = "logs/boost-sample_%N.log",                              /*< file name pattern >*/ | ||||
|         keywords::auto_flush = false, | ||||
|         keywords::format = "[%TimeStamp%]: %Message%" | ||||
|     ); | ||||
|  | ||||
|     logging::core::get()->set_filter | ||||
|     ( | ||||
|         logging::trivial::severity >= logging::trivial::info | ||||
|     ); | ||||
| } | ||||
|  | ||||
|  | ||||
| int main(int argc, char* []) | ||||
| { | ||||
|     int howmany = 1000000; | ||||
|     init(); | ||||
|     logging::add_common_attributes(); | ||||
|  | ||||
|     using namespace logging::trivial; | ||||
|     src::severity_logger_mt< severity_level > lg; | ||||
|     for(int i  = 0 ; i < howmany; ++i) | ||||
|         BOOST_LOG_SEV(lg, info) << "boost message #" << i << ": This is some text for your pleasure"; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										10
									
								
								vendor/spdlog/bench/easyl.conf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								vendor/spdlog/bench/easyl.conf
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| * GLOBAL: | ||||
|     FORMAT                  =   "[%datetime]: %msg" | ||||
|     FILENAME                =   ./logs/easylogging.log | ||||
|     ENABLED                 =   true | ||||
|     TO_FILE                 =   true | ||||
|     TO_STANDARD_OUTPUT      =   false | ||||
|     MILLISECONDS_WIDTH      =   3 | ||||
|     PERFORMANCE_TRACKING    =   false | ||||
|     MAX_LOG_FILE_SIZE       =   10485760 | ||||
|     Log_Flush_Threshold		= 	10485760 | ||||
							
								
								
									
										52
									
								
								vendor/spdlog/bench/easylogging-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								vendor/spdlog/bench/easylogging-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
|  | ||||
| #define _ELPP_THREAD_SAFE | ||||
| #include "easylogging++.h" | ||||
| _INITIALIZE_EASYLOGGINGPP | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|  | ||||
|     int thread_count = 10; | ||||
|     if(argc > 1) | ||||
|         thread_count = atoi(argv[1]); | ||||
|  | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|     // Load configuration from file | ||||
|     el::Configurations conf("easyl.conf"); | ||||
|     el::Loggers::reconfigureLogger("default", conf); | ||||
|  | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     vector<thread> threads; | ||||
|  | ||||
|     for (int t = 0; t < thread_count; ++t) | ||||
|     { | ||||
|         threads.push_back(std::thread([&]() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 int counter = ++msg_counter; | ||||
|                 if (counter > howmany) break; | ||||
|                 LOG(INFO) << "easylog message #" << counter << ": This is some text for your pleasure"; | ||||
|             } | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     for(auto &t:threads) | ||||
|     { | ||||
|         t.join(); | ||||
|     }; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										22
									
								
								vendor/spdlog/bench/easylogging-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/spdlog/bench/easylogging-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
|  | ||||
| #include "easylogging++.h" | ||||
|  | ||||
| _INITIALIZE_EASYLOGGINGPP | ||||
|  | ||||
| int main(int, char* []) | ||||
| { | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|     // Load configuration from file | ||||
|     el::Configurations conf("easyl.conf"); | ||||
|     el::Loggers::reconfigureLogger("default", conf); | ||||
|  | ||||
|     for(int i  = 0 ; i < howmany; ++i) | ||||
|         LOG(INFO) << "easylog message #" << i << ": This is some text for your pleasure"; | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										62
									
								
								vendor/spdlog/bench/g2log-async.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								vendor/spdlog/bench/g2log-async.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
| #include <iostream> | ||||
| #include <chrono> | ||||
|  | ||||
| #include "g2logworker.h" | ||||
| #include "g2log.h" | ||||
|  | ||||
| using namespace std; | ||||
| template<typename T> std::string format(const T& value); | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|     using namespace std::chrono; | ||||
|     using clock=steady_clock; | ||||
|     int thread_count = 10; | ||||
|  | ||||
|     if(argc > 1) | ||||
|         thread_count = atoi(argv[1]); | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|     g2LogWorker g2log(argv[0], "logs"); | ||||
|     g2::initializeLogging(&g2log); | ||||
|  | ||||
|  | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     vector<thread> threads; | ||||
|     auto start = clock::now(); | ||||
|     for (int t = 0; t < thread_count; ++t) | ||||
|     { | ||||
|         threads.push_back(std::thread([&]() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 int counter = ++msg_counter; | ||||
|                 if (counter > howmany) break; | ||||
|                 LOG(INFO) << "g2log message #" << counter << ": This is some text for your pleasure"; | ||||
|             } | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     for(auto &t:threads) | ||||
|     { | ||||
|         t.join(); | ||||
|     }; | ||||
|  | ||||
|     duration<float> delta = clock::now() - start; | ||||
|     float deltaf = delta.count(); | ||||
|     auto rate = howmany/deltaf; | ||||
|  | ||||
|     cout << "Total: " << howmany << std::endl; | ||||
|     cout << "Threads: " << thread_count << std::endl; | ||||
|     std::cout << "Delta = " << deltaf << " seconds" << std::endl; | ||||
|     std::cout << "Rate = " << rate << "/sec" << std::endl; | ||||
| } | ||||
							
								
								
									
										50
									
								
								vendor/spdlog/bench/glog-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/spdlog/bench/glog-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
|  | ||||
| #include "glog/logging.h" | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|  | ||||
|     int thread_count = 10; | ||||
|     if(argc > 1) | ||||
|         thread_count = atoi(argv[1]); | ||||
|  | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|     FLAGS_logtostderr = 0; | ||||
|     FLAGS_log_dir = "logs"; | ||||
|     google::InitGoogleLogging(argv[0]); | ||||
|  | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     vector<thread> threads; | ||||
|  | ||||
|     for (int t = 0; t < thread_count; ++t) | ||||
|     { | ||||
|         threads.push_back(std::thread([&]() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 int counter = ++msg_counter; | ||||
|                 if (counter > howmany) break; | ||||
|                 LOG(INFO) << "glog message #" << counter << ": This is some text for your pleasure"; | ||||
|             } | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     for(auto &t:threads) | ||||
|     { | ||||
|         t.join(); | ||||
|     }; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										21
									
								
								vendor/spdlog/bench/glog-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								vendor/spdlog/bench/glog-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include "glog/logging.h" | ||||
|  | ||||
|  | ||||
| int main(int, char* argv[]) | ||||
| { | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|  | ||||
|     FLAGS_logtostderr = 0; | ||||
|     FLAGS_log_dir = "logs"; | ||||
|     google::InitGoogleLogging(argv[0]); | ||||
|     for(int i  = 0 ; i < howmany; ++i) | ||||
|         LOG(INFO) << "glog message # " << i << ": This is some text for your pleasure"; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										32
									
								
								vendor/spdlog/bench/latency/Makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								vendor/spdlog/bench/latency/Makefile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| CXX	?= g++ | ||||
| CXXFLAGS	= -march=native -Wall -std=c++11 -pthread  | ||||
| CXX_RELEASE_FLAGS = -O2 -DNDEBUG | ||||
|  | ||||
|  | ||||
| binaries=spdlog-latency g3log-latency g3log-crush | ||||
|  | ||||
| all: $(binaries) | ||||
|  | ||||
| spdlog-latency: spdlog-latency.cpp | ||||
| 	$(CXX) spdlog-latency.cpp -o spdlog-latency $(CXXFLAGS) $(CXX_RELEASE_FLAGS) -I../../include | ||||
|  | ||||
|  | ||||
|  | ||||
| g3log-latency: g3log-latency.cpp | ||||
| 	$(CXX) g3log-latency.cpp -o g3log-latency $(CXXFLAGS) $(CXX_RELEASE_FLAGS) -I../../../g3log/src -L. -lg3logger  | ||||
| 		 | ||||
| 		 | ||||
| g3log-crush: g3log-crush.cpp | ||||
| 	$(CXX) g3log-crush.cpp -o g3log-crush $(CXXFLAGS) $(CXX_RELEASE_FLAGS) -I../../../g3log/src -L. -lg3logger  | ||||
| 		 | ||||
| 	 | ||||
| .PHONY: clean | ||||
|  | ||||
| clean: | ||||
| 	rm -f *.o  *.log $(binaries) | ||||
|  | ||||
|  | ||||
| rebuild: clean all | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										13
									
								
								vendor/spdlog/bench/latency/compare.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										13
									
								
								vendor/spdlog/bench/latency/compare.sh
									
									
									
									
										vendored
									
									
										Executable file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #!/bin/bash | ||||
| echo "running spdlog and g3log tests 10 time with ${1:-10} threads each (total 1,000,000 entries).." | ||||
| rm -f *.log | ||||
| for i in {1..10} | ||||
|  | ||||
| do | ||||
|    echo | ||||
|    sleep 0.5 | ||||
|    ./spdlog-latency ${1:-10} 2>/dev/null || exit | ||||
|    sleep 0.5 | ||||
|    ./g3log-latency ${1:-10} 2>/dev/null || exit | ||||
|  | ||||
| done | ||||
							
								
								
									
										37
									
								
								vendor/spdlog/bench/latency/g3log-crush.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								vendor/spdlog/bench/latency/g3log-crush.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| #include <iostream> | ||||
|  | ||||
| #include <g3log/g3log.hpp> | ||||
| #include <g3log/logworker.hpp> | ||||
|  | ||||
| void CrusherLoop() | ||||
| { | ||||
|     size_t counter = 0; | ||||
|     while (true) | ||||
|     { | ||||
|         LOGF(INFO, "Some text to crush you machine. thread:"); | ||||
|         if(++counter % 1000000 == 0) | ||||
|         { | ||||
|             std::cout << "Wrote " << counter << " entries" << std::endl; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     std::cout << "WARNING: This test will exaust all your machine memory and will crush it!" << std::endl; | ||||
|     std::cout << "Are you sure you want to continue ? " << std::endl; | ||||
|     char c; | ||||
|     std::cin >> c; | ||||
|     if (toupper( c ) != 'Y') | ||||
|         return 0; | ||||
|  | ||||
|     auto worker = g3::LogWorker::createLogWorker(); | ||||
|     auto handle= worker->addDefaultLogger(argv[0], "g3log.txt"); | ||||
|     g3::initializeLogging(worker.get()); | ||||
|     CrusherLoop(); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										129
									
								
								vendor/spdlog/bench/latency/g3log-latency.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								vendor/spdlog/bench/latency/g3log-latency.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
| #include <iostream> | ||||
| #include <chrono> | ||||
| #include <algorithm> | ||||
| #include <iomanip> | ||||
| #include <iostream> | ||||
| #include <sstream> | ||||
| #include <fstream> | ||||
| #include <cstdio> | ||||
| #include <map> | ||||
| #include <numeric> | ||||
| #include <functional> | ||||
| #include <thread> | ||||
| #include "utils.h" | ||||
| #include <g3log/g3log.hpp> | ||||
| #include <g3log/logworker.hpp> | ||||
|  | ||||
|  | ||||
| namespace | ||||
| { | ||||
| const uint64_t g_iterations = 1000000; | ||||
|  | ||||
|  | ||||
| std::atomic<size_t> g_counter = {0}; | ||||
|  | ||||
|  | ||||
| void MeasurePeakDuringLogWrites(const size_t id, std::vector<uint64_t>& result) | ||||
| { | ||||
|  | ||||
|     while (true) | ||||
|     { | ||||
|         const size_t value_now = ++g_counter; | ||||
|         if (value_now > g_iterations) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         auto start_time = std::chrono::high_resolution_clock::now(); | ||||
|         LOGF(INFO, "Some text to log for thread: %ld", id); | ||||
|         auto stop_time = std::chrono::high_resolution_clock::now(); | ||||
|         uint64_t time_us = std::chrono::duration_cast<std::chrono::microseconds>(stop_time - start_time).count(); | ||||
|         result.push_back(time_us); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| void PrintResults(const std::map<size_t, std::vector<uint64_t>>& threads_result, size_t total_us) | ||||
| { | ||||
|  | ||||
|     std::vector<uint64_t> all_measurements; | ||||
|     all_measurements.reserve(g_iterations); | ||||
|     for (auto& t_result : threads_result) | ||||
|     { | ||||
|         all_measurements.insert(all_measurements.end(), t_result.second.begin(), t_result.second.end()); | ||||
|     } | ||||
|  | ||||
|     // calc worst latenct | ||||
|     auto worst = *std::max_element(all_measurements.begin(), all_measurements.end()); | ||||
|  | ||||
|     // calc avg | ||||
|     auto total = accumulate(begin(all_measurements), end(all_measurements), 0, std::plus<uint64_t>()); | ||||
|     auto avg = double(total)/all_measurements.size(); | ||||
|  | ||||
|     std::cout << "[g3log]  worst: " <<  std::setw(10) << std::right << worst << "\tAvg: "  << avg << "\tTotal: "  <<  utils::format(total_us) << " us" << std::endl; | ||||
|  | ||||
| } | ||||
| }// anonymous | ||||
|  | ||||
|  | ||||
| // The purpose of this test is NOT to see how fast | ||||
| // each thread can possibly write. It is to see what | ||||
| // the worst latency is for writing a log entry | ||||
| // | ||||
| // In the test 1 million log entries will be written | ||||
| // an atomic counter is used to give each thread what | ||||
| // it is to write next. The overhead of atomic | ||||
| // synchronization between the threads are not counted in the worst case latency | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     size_t number_of_threads {0}; | ||||
|     if (argc == 2) | ||||
|     { | ||||
|         number_of_threads = atoi(argv[1]); | ||||
|     } | ||||
|     if (argc != 2 || number_of_threads == 0) | ||||
|     { | ||||
|         std::cerr << "USAGE is: " << argv[0] << " number_threads" << std::endl; | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     std::vector<std::thread> threads(number_of_threads); | ||||
|     std::map<size_t, std::vector<uint64_t>> threads_result; | ||||
|  | ||||
|     for (size_t idx = 0; idx < number_of_threads; ++idx) | ||||
|     { | ||||
|         // reserve to 1 million for all the result | ||||
|         // it's a test so  let's not care about the wasted space | ||||
|         threads_result[idx].reserve(g_iterations); | ||||
|     } | ||||
|  | ||||
|     const std::string g_path = "./" ; | ||||
|     const std::string  g_prefix_log_name = "g3log-performance-"; | ||||
|     const std::string  g_measurement_dump = g_path + g_prefix_log_name + "_RESULT.txt"; | ||||
|  | ||||
|     auto worker = g3::LogWorker::createLogWorker(); | ||||
|     auto handle= worker->addDefaultLogger(argv[0], "g3log.txt"); | ||||
|     g3::initializeLogging(worker.get()); | ||||
|  | ||||
|     auto start_time_application_total = std::chrono::high_resolution_clock::now(); | ||||
|     for (uint64_t idx = 0; idx < number_of_threads; ++idx) | ||||
|     { | ||||
|         threads[idx] = std::thread(MeasurePeakDuringLogWrites, idx, std::ref(threads_result[idx])); | ||||
|     } | ||||
|     for (size_t idx = 0; idx < number_of_threads; ++idx) | ||||
|     { | ||||
|         threads[idx].join(); | ||||
|     } | ||||
|     auto stop_time_application_total = std::chrono::high_resolution_clock::now(); | ||||
|  | ||||
|     uint64_t total_time_in_us = std::chrono::duration_cast<std::chrono::microseconds>(stop_time_application_total - start_time_application_total).count(); | ||||
|     PrintResults(threads_result, total_time_in_us); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										128
									
								
								vendor/spdlog/bench/latency/spdlog-latency.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								vendor/spdlog/bench/latency/spdlog-latency.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
| #include <iostream> | ||||
| #include <chrono> | ||||
| #include <algorithm> | ||||
| #include <iostream> | ||||
| #include <cstdio> | ||||
| #include <map> | ||||
| #include <numeric> | ||||
| #include <functional> | ||||
| #include "utils.h" | ||||
| #include <thread> | ||||
|  | ||||
| #include "spdlog/spdlog.h" | ||||
|  | ||||
| namespace spd = spdlog; | ||||
|  | ||||
| namespace | ||||
| { | ||||
| const uint64_t g_iterations = 1000000; | ||||
|  | ||||
|  | ||||
| std::atomic<size_t> g_counter = {0}; | ||||
|  | ||||
|  | ||||
| void MeasurePeakDuringLogWrites(const size_t id, std::vector<uint64_t>& result) | ||||
| { | ||||
|     auto logger = spd::get("file_logger"); | ||||
|     while (true) | ||||
|     { | ||||
|         const size_t value_now = ++g_counter; | ||||
|         if (value_now > g_iterations) | ||||
|         { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         auto start_time = std::chrono::high_resolution_clock::now(); | ||||
|         logger->info("Some text to log for thread: [somemore text...............................] {}", id); | ||||
|         auto stop_time = std::chrono::high_resolution_clock::now(); | ||||
|         uint64_t time_us = std::chrono::duration_cast<std::chrono::microseconds>(stop_time - start_time).count(); | ||||
|         result.push_back(time_us); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| void PrintResults(const std::map<size_t, std::vector<uint64_t>>& threads_result, size_t total_us) | ||||
| { | ||||
|  | ||||
|     std::vector<uint64_t> all_measurements; | ||||
|     all_measurements.reserve(g_iterations); | ||||
|     for (auto& t_result : threads_result) | ||||
|     { | ||||
|         all_measurements.insert(all_measurements.end(), t_result.second.begin(), t_result.second.end()); | ||||
|     } | ||||
|  | ||||
|     // calc worst latenct | ||||
|     auto worst = *std::max_element(all_measurements.begin(), all_measurements.end()); | ||||
|  | ||||
|     // calc avg | ||||
|     auto total = accumulate(begin(all_measurements), end(all_measurements), 0, std::plus<uint64_t>()); | ||||
|     auto avg = double(total)/all_measurements.size(); | ||||
|  | ||||
|     std::cout << "[spdlog] worst: " <<  std::setw(10) << std::right << worst << "\tAvg: "  << avg << "\tTotal: "  <<  utils::format(total_us) << " us" << std::endl; | ||||
|  | ||||
| } | ||||
| }// anonymous | ||||
|  | ||||
|  | ||||
| // The purpose of this test is NOT to see how fast | ||||
| // each thread can possibly write. It is to see what | ||||
| // the worst latency is for writing a log entry | ||||
| // | ||||
| // In the test 1 million log entries will be written | ||||
| // an atomic counter is used to give each thread what | ||||
| // it is to write next. The overhead of atomic | ||||
| // synchronization between the threads are not counted in the worst case latency | ||||
| int main(int argc, char** argv) | ||||
| { | ||||
|     size_t number_of_threads {0}; | ||||
|     if (argc == 2) | ||||
|     { | ||||
|         number_of_threads = atoi(argv[1]); | ||||
|     } | ||||
|     if (argc != 2 || number_of_threads == 0) | ||||
|     { | ||||
|         std::cerr << "usage: " << argv[0] << " number_threads" << std::endl; | ||||
|         return 1; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     std::vector<std::thread> threads(number_of_threads); | ||||
|     std::map<size_t, std::vector<uint64_t>> threads_result; | ||||
|  | ||||
|     for (size_t idx = 0; idx < number_of_threads; ++idx) | ||||
|     { | ||||
|         // reserve to 1 million for all the result | ||||
|         // it's a test so  let's not care about the wasted space | ||||
|         threads_result[idx].reserve(g_iterations); | ||||
|     } | ||||
|  | ||||
|     int queue_size = 1048576; // 2 ^ 20 | ||||
|     spdlog::set_async_mode(queue_size); | ||||
|     auto logger = spdlog::create<spd::sinks::simple_file_sink_mt>("file_logger", "spdlog.log", true); | ||||
|  | ||||
|     //force flush on every call to compare with g3log | ||||
|     auto s = (spd::sinks::simple_file_sink_mt*)logger->sinks()[0].get(); | ||||
|     s->set_force_flush(true); | ||||
|  | ||||
|     auto start_time_application_total = std::chrono::high_resolution_clock::now(); | ||||
|     for (uint64_t idx = 0; idx < number_of_threads; ++idx) | ||||
|     { | ||||
|         threads[idx] = std::thread(MeasurePeakDuringLogWrites, idx, std::ref(threads_result[idx])); | ||||
|     } | ||||
|     for (size_t idx = 0; idx < number_of_threads; ++idx) | ||||
|     { | ||||
|         threads[idx].join(); | ||||
|     } | ||||
|     auto stop_time_application_total = std::chrono::high_resolution_clock::now(); | ||||
|  | ||||
|     uint64_t total_time_in_us = std::chrono::duration_cast<std::chrono::microseconds>(stop_time_application_total - start_time_application_total).count(); | ||||
|  | ||||
|     PrintResults(threads_result, total_time_in_us); | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										35
									
								
								vendor/spdlog/bench/latency/utils.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/spdlog/bench/latency/utils.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <sstream> | ||||
| #include <iomanip> | ||||
| #include <locale> | ||||
|  | ||||
| namespace utils | ||||
| { | ||||
|  | ||||
| template<typename T> | ||||
| 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(); | ||||
| } | ||||
|  | ||||
| } | ||||
							
								
								
									
										4
									
								
								vendor/spdlog/bench/logs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								vendor/spdlog/bench/logs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| # Ignore everything in this directory | ||||
| * | ||||
| # Except this file | ||||
| !.gitignore | ||||
							
								
								
									
										62
									
								
								vendor/spdlog/bench/spdlog-async.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								vendor/spdlog/bench/spdlog-async.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
| #include <iostream> | ||||
| #include <chrono> | ||||
| #include <cstdlib> | ||||
| #include "spdlog/spdlog.h" | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|  | ||||
|     using namespace std::chrono; | ||||
|     using clock=steady_clock; | ||||
|     namespace spd = spdlog; | ||||
|  | ||||
|     int thread_count = 10; | ||||
|     if(argc > 1) | ||||
|         thread_count = ::atoi(argv[1]); | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|     spd::set_async_mode(1048576); | ||||
|     auto logger = spdlog::create<spd::sinks::simple_file_sink_mt>("file_logger", "logs/spd-bench-async.txt", false); | ||||
|     logger->set_pattern("[%Y-%b-%d %T.%e]: %v"); | ||||
|  | ||||
|  | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     vector<thread> threads; | ||||
|     auto start = clock::now(); | ||||
|     for (int t = 0; t < thread_count; ++t) | ||||
|     { | ||||
|         threads.push_back(std::thread([&]() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 int counter = ++msg_counter; | ||||
|                 if (counter > howmany) break; | ||||
|                 logger->info("spdlog message #{}: This is some text for your pleasure", counter); | ||||
|             } | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|     for(auto &t:threads) | ||||
|     { | ||||
|         t.join(); | ||||
|     }; | ||||
|  | ||||
|     duration<float> delta = clock::now() - start; | ||||
|     float deltaf = delta.count(); | ||||
|     auto rate = howmany/deltaf; | ||||
|  | ||||
|     cout << "Total: " << howmany << std::endl; | ||||
|     cout << "Threads: " << thread_count << std::endl; | ||||
|     std::cout << "Delta = " << deltaf << " seconds" << std::endl; | ||||
|     std::cout << "Rate = " << rate << "/sec" << std::endl; | ||||
| } | ||||
							
								
								
									
										55
									
								
								vendor/spdlog/bench/spdlog-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								vendor/spdlog/bench/spdlog-bench-mt.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include <thread> | ||||
| #include <vector> | ||||
| #include <atomic> | ||||
| #include <cstdlib> | ||||
| #include "spdlog/spdlog.h" | ||||
|  | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|  | ||||
|     int thread_count = 10; | ||||
|     if(argc > 1) | ||||
|         thread_count = std::atoi(argv[1]); | ||||
|  | ||||
|     int howmany = 1000000; | ||||
|  | ||||
|     namespace spd = spdlog; | ||||
|  | ||||
|     auto logger = spdlog::create<spd::sinks::simple_file_sink_mt>("file_logger", "logs/spd-bench-mt.txt", false); | ||||
|  | ||||
|     logger->set_pattern("[%Y-%b-%d %T.%e]: %v"); | ||||
|  | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     std::vector<thread> threads; | ||||
|  | ||||
|     for (int t = 0; t < thread_count; ++t) | ||||
|     { | ||||
|         threads.push_back(std::thread([&]() | ||||
|         { | ||||
|             while (true) | ||||
|             { | ||||
|                 int counter = ++msg_counter; | ||||
|                 if (counter > howmany) break; | ||||
|                 logger->info("spdlog message #{}: This is some text for your pleasure", counter); | ||||
|             } | ||||
|         })); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     for(auto &t:threads) | ||||
|     { | ||||
|         t.join(); | ||||
|     }; | ||||
|  | ||||
|  | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										20
									
								
								vendor/spdlog/bench/spdlog-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								vendor/spdlog/bench/spdlog-bench.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #include "spdlog/spdlog.h" | ||||
|  | ||||
|  | ||||
| int main(int, char* []) | ||||
| { | ||||
|     int howmany = 1000000; | ||||
|     namespace spd = spdlog; | ||||
|     ///Create a file rotating logger with 5mb size max and 3 rotated files | ||||
|     auto logger = spdlog::create<spd::sinks::simple_file_sink_st>("file_logger", "logs/spd-bench-st.txt", false); | ||||
|  | ||||
|     logger->set_pattern("[%Y-%b-%d %T.%e]: %v"); | ||||
|     for(int i  = 0 ; i < howmany; ++i) | ||||
|         logger->info("spdlog message #{} : This is some text for your pleasure", i); | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										112
									
								
								vendor/spdlog/bench/spdlog-null-async.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								vendor/spdlog/bench/spdlog-null-async.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| // | ||||
| // bench.cpp : spdlog benchmarks | ||||
| // | ||||
| #include <atomic> | ||||
| #include <cstdlib> // EXIT_FAILURE | ||||
| #include <iostream> | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <thread> | ||||
| #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<spdlog::logger> 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<null_sink_st>("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" <<std::endl; | ||||
|  | ||||
|     } | ||||
|     catch (std::exception &ex) | ||||
|     { | ||||
|         std::cerr << "Error: " << ex.what() << std::endl; | ||||
|         perror("Last error"); | ||||
|         return EXIT_FAILURE; | ||||
|     } | ||||
|     return EXIT_SUCCESS; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| //return rate/sec | ||||
| size_t bench_as(int howmany, std::shared_ptr<spdlog::logger> log, int thread_count) | ||||
| { | ||||
|     cout << log->name() << "...\t\t" << flush; | ||||
|     std::atomic<int > msg_counter {0}; | ||||
|     vector<thread> 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<duration<double>> (delta).count(); | ||||
|     auto per_sec = size_t(howmany / delta_d); | ||||
|     cout << format(per_sec) << "/sec" << endl; | ||||
|     return per_sec; | ||||
| } | ||||
							
								
								
									
										35
									
								
								vendor/spdlog/bench/utils.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/spdlog/bench/utils.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| // | ||||
| // Copyright(c) 2015 Gabi Melman. | ||||
| // Distributed under the MIT License (http://opensource.org/licenses/MIT) | ||||
| // | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <sstream> | ||||
| #include <iomanip> | ||||
| #include <locale> | ||||
|  | ||||
| namespace utils | ||||
| { | ||||
|  | ||||
| template<typename T> | ||||
| 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(); | ||||
| } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user