| 
									
										
										
										
											2014-11-01 03:20:54 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /* spdlog - an extremely fast and easy to use c++11 logging library.     */ | 
					
						
							|  |  |  | /* Copyright (c) 2014 Gabi Melman.                                       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-10-31 16:34:48 +02:00
										 |  |  | // bench.cpp : spdlog benchmarks
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <thread>
 | 
					
						
							|  |  |  | #include <atomic>
 | 
					
						
							| 
									
										
										
										
											2014-10-31 03:17:40 +02:00
										 |  |  | #include "spdlog/spdlog.h"
 | 
					
						
							| 
									
										
										
										
											2014-11-24 01:29:09 +02:00
										 |  |  | #include "spdlog/async_logger.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-31 03:17:40 +02:00
										 |  |  | #include "spdlog/sinks/file_sinks.h"
 | 
					
						
							|  |  |  | #include "spdlog/sinks/null_sink.h"
 | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | #include "utils.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-31 03:17:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | using namespace std::chrono; | 
					
						
							| 
									
										
										
										
											2014-10-31 03:17:40 +02:00
										 |  |  | using namespace spdlog; | 
					
						
							| 
									
										
										
										
											2014-10-31 16:34:48 +02:00
										 |  |  | using namespace spdlog::sinks; | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | using namespace utils; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | void bench(int howmany, std::shared_ptr<spdlog::logger> log); | 
					
						
							|  |  |  | void bench_mt(int howmany, std::shared_ptr<spdlog::logger> log, int thread_count); | 
					
						
							| 
									
										
										
										
											2014-12-07 18:49:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | int main(int argc, char* argv[]) | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-26 01:29:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     int howmany = 1048576; | 
					
						
							|  |  |  |     int threads = 10; | 
					
						
							|  |  |  |     bool auto_flush = false; | 
					
						
							|  |  |  |     int file_size = 30 * 1024 * 1024; | 
					
						
							|  |  |  |     int rotating_files = 5; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if(argc > 1) | 
					
						
							|  |  |  |             howmany = atoi(argv[1]); | 
					
						
							|  |  |  |         if (argc > 2) | 
					
						
							|  |  |  |             threads =   atoi(argv[2]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cout << "*******************************************************************************\n"; | 
					
						
							|  |  |  |         cout << "Single thread, " << format(howmany)  << " iterations, auto flush=" << auto_flush << endl; | 
					
						
							|  |  |  |         cout << "*******************************************************************************\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         auto rotating_st = spdlog::rotating_logger_st("rotating_st", "logs/rotating_st", file_size, rotating_files, auto_flush); | 
					
						
							|  |  |  |         bench(howmany, rotating_st); | 
					
						
							|  |  |  |         auto daily_st = spdlog::daily_logger_st("daily_st", "logs/daily_st", auto_flush); | 
					
						
							|  |  |  |         bench(howmany, daily_st); | 
					
						
							|  |  |  |         bench(howmany, spdlog::create<null_sink_st>("null_st")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cout << "\n*******************************************************************************\n"; | 
					
						
							|  |  |  |         cout << threads << " threads sharing same logger, " << format(howmany)  << " iterations, auto_flush=" << auto_flush << endl; | 
					
						
							|  |  |  |         cout << "*******************************************************************************\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         auto rotating_mt = spdlog::rotating_logger_mt("rotating_mt", "logs/rotating_mt", file_size, rotating_files, auto_flush); | 
					
						
							|  |  |  |         bench_mt(howmany, rotating_mt, threads); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         auto daily_mt = spdlog::daily_logger_mt("daily_mt", "logs/daily_mt", auto_flush); | 
					
						
							|  |  |  |         bench_mt(howmany, daily_mt, threads); | 
					
						
							|  |  |  |         bench(howmany, spdlog::create<null_sink_st>("null_mt")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cout << "\n*******************************************************************************\n"; | 
					
						
							|  |  |  |         cout << "async logging.. " << threads << " threads sharing same logger, " << format(howmany) << " iterations, auto_flush=" << auto_flush << endl; | 
					
						
							|  |  |  |         cout << "*******************************************************************************\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         spdlog::set_async_mode(howmany); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for(int i = 0; i < 3; ++i) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             auto as = spdlog::daily_logger_st("as", "logs/daily_async", auto_flush); | 
					
						
							|  |  |  |             bench_mt(howmany, as, threads); | 
					
						
							|  |  |  |             spdlog::drop("as"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     catch (std::exception &ex) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::cerr << "Error: " << ex.what() << std::endl; | 
					
						
							|  |  |  |         perror("Last error"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void bench(int howmany, std::shared_ptr<spdlog::logger> log) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     cout << log->name() << "...\t\t" << flush; | 
					
						
							|  |  |  |     auto start = system_clock::now(); | 
					
						
							|  |  |  |     for (auto i = 0; i < howmany; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         log->info("Hello logger: msg number {}", i); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     auto delta = system_clock::now() - start; | 
					
						
							|  |  |  |     auto delta_d = duration_cast<duration<double>> (delta).count(); | 
					
						
							|  |  |  |     cout << format(int(howmany / delta_d)) << "/sec" << endl; | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void bench_mt(int howmany, std::shared_ptr<spdlog::logger> log, int thread_count) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     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(); | 
					
						
							|  |  |  |     cout << format(int(howmany / delta_d)) << "/sec" << endl; | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | } |