| 
									
										
										
										
											2015-11-28 18:24:20 +02:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Copyright(c) 2015 Gabi Melman.
 | 
					
						
							|  |  |  | // Distributed under the MIT License (http://opensource.org/licenses/MIT)
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-11-01 03:20:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-10-31 16:34:48 +02:00
										 |  |  | // bench.cpp : spdlog benchmarks
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2018-04-14 03:34:57 +03:00
										 |  |  | #include "spdlog/async.h"
 | 
					
						
							| 
									
										
										
										
											2018-07-07 13:22:43 +03:00
										 |  |  | #include "spdlog/sinks/basic_file_sink.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-29 01:26:10 +03:00
										 |  |  | #include "spdlog/sinks/daily_file_sink.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  | #include "spdlog/sinks/null_sink.h"
 | 
					
						
							| 
									
										
										
										
											2018-04-29 01:36:45 +03:00
										 |  |  | #include "spdlog/sinks/rotating_file_sink.h"
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  | #include "spdlog/spdlog.h"
 | 
					
						
							|  |  |  | #include "utils.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-10 22:58:53 +03:00
										 |  |  | #include <atomic>
 | 
					
						
							|  |  |  | #include <cstdlib> // EXIT_FAILURE
 | 
					
						
							| 
									
										
										
										
											2014-10-31 16:34:48 +02:00
										 |  |  | #include <iostream>
 | 
					
						
							|  |  |  | #include <memory>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							|  |  |  | #include <thread>
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  | int main(int argc, char *argv[]) | 
					
						
							| 
									
										
										
										
											2014-10-11 01:15:26 +03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-26 01:29:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-12 22:31:37 +03:00
										 |  |  |     int howmany = 1000000; | 
					
						
							| 
									
										
										
										
											2018-07-09 21:06:59 +03:00
										 |  |  |     int queue_size = howmany + 2; | 
					
						
							| 
									
										
										
										
											2018-04-29 01:23:18 +03:00
										 |  |  |     int threads = 10; | 
					
						
							| 
									
										
										
										
											2018-08-17 00:32:13 +03:00
										 |  |  |     size_t file_size = 30 * 1024 * 1024; | 
					
						
							|  |  |  |     size_t rotating_files = 5; | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     try | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         if (argc > 1) | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |             howmany = atoi(argv[1]); | 
					
						
							|  |  |  |         if (argc > 2) | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |             threads = atoi(argv[2]); | 
					
						
							| 
									
										
										
										
											2015-03-12 22:31:37 +03:00
										 |  |  |         if (argc > 3) | 
					
						
							|  |  |  |             queue_size = atoi(argv[3]); | 
					
						
							| 
									
										
										
										
											2018-04-29 01:36:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-21 23:48:07 +03:00
										 |  |  |         cout << "******************************************************************" | 
					
						
							|  |  |  |                 "*************\n"; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         cout << "Single thread, " << format(howmany) << " iterations" << endl; | 
					
						
							| 
									
										
										
										
											2018-07-21 23:48:07 +03:00
										 |  |  |         cout << "******************************************************************" | 
					
						
							|  |  |  |                 "*************\n"; | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |         auto basic_st = spdlog::basic_logger_mt("basic_st", "logs/basic_st.log", true); | 
					
						
							|  |  |  |         bench(howmany, basic_st); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 12:08:56 +02:00
										 |  |  |         auto rotating_st = spdlog::rotating_logger_st("rotating_st", "logs/rotating_st.log", file_size, rotating_files); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         bench(howmany, rotating_st); | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 12:08:56 +02:00
										 |  |  |         auto daily_st = spdlog::daily_logger_st("daily_st", "logs/daily_st.log"); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         bench(howmany, daily_st); | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         bench(howmany, spdlog::create<null_sink_st>("null_st")); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-21 23:48:07 +03:00
										 |  |  |         cout << "\n****************************************************************" | 
					
						
							|  |  |  |                 "***************\n"; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         cout << threads << " threads sharing same logger, " << format(howmany) << " iterations" << endl; | 
					
						
							| 
									
										
										
										
											2018-07-21 23:48:07 +03:00
										 |  |  |         cout << "******************************************************************" | 
					
						
							|  |  |  |                 "*************\n"; | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |         auto basic_mt = spdlog::basic_logger_mt("basic_mt", "logs/basic_mt.log", true); | 
					
						
							|  |  |  |         bench_mt(howmany, basic_mt, threads); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 12:08:56 +02:00
										 |  |  |         auto rotating_mt = spdlog::rotating_logger_mt("rotating_mt", "logs/rotating_mt.log", file_size, rotating_files); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         bench_mt(howmany, rotating_mt, threads); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 12:08:56 +02:00
										 |  |  |         auto daily_mt = spdlog::daily_logger_mt("daily_mt", "logs/daily_mt.log"); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         bench_mt(howmany, daily_mt, threads); | 
					
						
							| 
									
										
										
										
											2018-07-10 23:53:00 +03:00
										 |  |  |         bench_mt(howmany, spdlog::create<null_sink_mt>("null_mt"), threads); | 
					
						
							| 
									
										
										
										
											2018-04-29 01:23:18 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-21 23:48:07 +03:00
										 |  |  |         cout << "\n****************************************************************" | 
					
						
							|  |  |  |                 "***************\n"; | 
					
						
							| 
									
										
										
										
											2016-09-02 17:16:02 +03:00
										 |  |  |         cout << "async logging.. " << threads << " threads sharing same logger, " << format(howmany) << " iterations " << endl; | 
					
						
							| 
									
										
										
										
											2018-07-21 23:48:07 +03:00
										 |  |  |         cout << "******************************************************************" | 
					
						
							|  |  |  |                 "*************\n"; | 
					
						
							| 
									
										
										
										
											2018-06-01 17:52:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-29 01:23:18 +03:00
										 |  |  |         for (int i = 0; i < 3; ++i) | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2018-08-17 00:32:13 +03:00
										 |  |  |             spdlog::init_thread_pool(static_cast<size_t>(queue_size), 1); | 
					
						
							| 
									
										
										
										
											2018-07-08 16:46:12 +03:00
										 |  |  |             auto as = spdlog::basic_logger_mt<spdlog::async_factory>("async", "logs/basic_async.log", true); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |             bench_mt(howmany, as, threads); | 
					
						
							| 
									
										
										
										
											2018-07-08 16:46:12 +03:00
										 |  |  |             spdlog::drop("async"); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     catch (std::exception &ex) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         std::cerr << "Error: " << ex.what() << std::endl; | 
					
						
							|  |  |  |         perror("Last error"); | 
					
						
							| 
									
										
										
										
											2015-09-10 22:58:53 +03:00
										 |  |  |         return EXIT_FAILURE; | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-10 22:58:53 +03:00
										 |  |  |     return EXIT_SUCCESS; | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |     using std::chrono::high_resolution_clock; | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     cout << log->name() << "...\t\t" << flush; | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |     auto start = high_resolution_clock::now(); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     for (auto i = 0; i < howmany; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         log->info("Hello logger: msg number {}", i); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |     auto delta = high_resolution_clock::now() - start; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |     auto delta_d = duration_cast<duration<double>>(delta).count(); | 
					
						
							| 
									
										
										
										
											2018-07-14 16:21:53 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-01 17:50:59 +03:00
										 |  |  |     cout << "Elapsed: " << delta_d << "\t" << format(int(howmany / delta_d)) << "/sec" << endl; | 
					
						
							| 
									
										
										
										
											2018-07-10 23:53:00 +03:00
										 |  |  |     spdlog::drop(log->name()); | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void bench_mt(int howmany, std::shared_ptr<spdlog::logger> log, int thread_count) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |     using std::chrono::high_resolution_clock; | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     cout << log->name() << "...\t\t" << flush; | 
					
						
							|  |  |  |     vector<thread> threads; | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |     auto start = high_resolution_clock::now(); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     for (int t = 0; t < thread_count; ++t) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |         threads.push_back(std::thread([&]() { | 
					
						
							| 
									
										
										
										
											2018-07-07 13:22:43 +03:00
										 |  |  |             for (int j = 0; j < howmany / thread_count; j++) | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2018-07-05 16:19:23 +03:00
										 |  |  |                 log->info("Hello logger: msg number {}", j); | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         })); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |     for (auto &t : threads) | 
					
						
							| 
									
										
										
										
											2014-12-21 02:47:04 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         t.join(); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-07 13:22:43 +03:00
										 |  |  |     auto delta = high_resolution_clock::now() - start; | 
					
						
							| 
									
										
										
										
											2018-03-09 15:26:33 +02:00
										 |  |  |     auto delta_d = duration_cast<duration<double>>(delta).count(); | 
					
						
							| 
									
										
										
										
											2018-06-01 17:50:59 +03:00
										 |  |  |     cout << "Elapsed: " << delta_d << "\t" << format(int(howmany / delta_d)) << "/sec" << endl; | 
					
						
							| 
									
										
										
										
											2014-11-01 02:12:12 +02:00
										 |  |  | } |