| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Copyright(c) 2015 Gabi Melman.
 | 
					
						
							|  |  |  | // Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // bench.cpp : spdlog benchmarks
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  | #include "spdlog/async.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  | #include "spdlog/async_logger.h"
 | 
					
						
							|  |  |  | #include "spdlog/sinks/null_sink.h"
 | 
					
						
							|  |  |  | #include "spdlog/spdlog.h"
 | 
					
						
							|  |  |  | #include "utils.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | #include <atomic>
 | 
					
						
							|  |  |  | #include <cstdlib> // EXIT_FAILURE
 | 
					
						
							|  |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <thread>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  | int main(int argc, char *argv[]) | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |     int howmany; | 
					
						
							|  |  |  |     int tp_queue_size; | 
					
						
							|  |  |  |     int tp_threads = 1; | 
					
						
							|  |  |  |     int client_threads = 10; | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |     int iters = 10; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |         if (argc < 2) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-05-26 18:51:55 +03:00
										 |  |  |             cout << "Usage: " << argv[0] << " <howmany> [client_threads] [q_size] [tp_threads]" << endl; | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |             return (1); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |         howmany = atoi(argv[1]); | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |         if (argc > 2) | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |             client_threads = atoi(argv[2]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |         if (argc > 3) | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |             tp_queue_size = atoi(argv[3]); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             tp_queue_size = howmany; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (argc > 4) | 
					
						
							|  |  |  |             tp_threads = atoi(argv[4]); | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         cout << "\n*******************************************************************************\n"; | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |         cout << "messages:\t" << format(howmany) << endl; | 
					
						
							| 
									
										
										
										
											2018-05-26 18:57:29 +03:00
										 |  |  |         cout << "client_threads:\t" << client_threads << endl; | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |         cout << "tp queue:\t" << format(tp_queue_size) << endl; | 
					
						
							|  |  |  |         cout << "tp threads:\t" << tp_threads << endl; | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |         cout << "*******************************************************************************\n"; | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |         size_t total_rate = 0; | 
					
						
							| 
									
										
										
										
											2018-06-01 17:50:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         for (int i = 0; i < iters; ++i) | 
					
						
							| 
									
										
										
										
											2018-05-27 03:14:55 +03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-06-01 17:50:59 +03:00
										 |  |  |             spdlog::init_thread_pool(tp_queue_size, tp_threads); | 
					
						
							| 
									
										
										
										
											2018-05-27 03:02:28 +03:00
										 |  |  |             auto as = spdlog::create_async_logger<null_sink_mt>("async(null-sink)"); | 
					
						
							| 
									
										
										
										
											2018-05-26 18:48:33 +03:00
										 |  |  |             total_rate += bench_as(howmany, as, client_threads); | 
					
						
							| 
									
										
										
										
											2018-06-01 17:52:05 +03:00
										 |  |  |             spdlog::drop("async(null-sink)"); | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |         } | 
					
						
							|  |  |  |         std::cout << endl; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         std::cout << "Avg rate: " << format(total_rate / iters) << "/sec" << std::endl; | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |     } | 
					
						
							|  |  |  |     catch (std::exception &ex) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::cerr << "Error: " << ex.what() << std::endl; | 
					
						
							|  |  |  |         perror("Last error"); | 
					
						
							|  |  |  |         return EXIT_FAILURE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return EXIT_SUCCESS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  | // return rate/sec
 | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | size_t bench_as(int howmany, std::shared_ptr<spdlog::logger> log, int thread_count) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cout << log->name() << "...\t\t" << flush; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |     std::atomic<int> msg_counter{0}; | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |     vector<thread> threads; | 
					
						
							|  |  |  |     auto start = system_clock::now(); | 
					
						
							|  |  |  |     for (int t = 0; t < thread_count; ++t) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         threads.push_back(std::thread([&]() { | 
					
						
							|  |  |  |             for (;;) | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |             { | 
					
						
							|  |  |  |                 int counter = ++msg_counter; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |                 if (counter > howmany) | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |                 log->info("Hello logger: msg number {}", counter); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |     for (auto &t : threads) | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |     { | 
					
						
							|  |  |  |         t.join(); | 
					
						
							| 
									
										
										
										
											2018-03-19 19:22:02 +03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     auto delta = system_clock::now() - start; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |     auto delta_d = duration_cast<duration<double>>(delta).count(); | 
					
						
							| 
									
										
										
										
											2016-09-18 01:51:53 +03:00
										 |  |  |     auto per_sec = size_t(howmany / delta_d); | 
					
						
							|  |  |  |     cout << format(per_sec) << "/sec" << endl; | 
					
						
							|  |  |  |     return per_sec; | 
					
						
							|  |  |  | } |