spdlog
Loading...
Searching...
No Matches
bench.cpp
Go to the documentation of this file.
1//
2// Copyright(c) 2015 Gabi Melman.
3// Distributed under the MIT License (http://opensource.org/licenses/MIT)
4//
5
6//
7// bench.cpp : spdlog benchmarks
8//
9#include "spdlog/spdlog.h"
14
15#ifdef SPDLOG_FMT_EXTERNAL
16# include <fmt/locale.h>
17#else
19#endif
20
21#include "utils.h"
22#include <atomic>
23#include <cstdlib> // EXIT_FAILURE
24#include <memory>
25#include <string>
26#include <thread>
27
28void bench(int howmany, std::shared_ptr<spdlog::logger> log);
29void bench_mt(int howmany, std::shared_ptr<spdlog::logger> log, size_t thread_count);
30
31// void bench_default_api(int howmany, std::shared_ptr<spdlog::logger> log);
32// void bench_c_string(int howmany, std::shared_ptr<spdlog::logger> log);
33
34static const size_t file_size = 30 * 1024 * 1024;
35static const size_t rotating_files = 5;
36static const int max_threads = 1000;
37
38void bench_threaded_logging(size_t threads, int iters)
39{
40 spdlog::info("**************************************************************");
41 spdlog::info(fmt::format(std::locale("en_US.UTF-8"), "Multi threaded: {:L} threads, {:L} messages", threads, iters));
42 spdlog::info("**************************************************************");
43
44 auto basic_mt = spdlog::basic_logger_mt("basic_mt", "logs/basic_mt.log", true);
45 bench_mt(iters, std::move(basic_mt), threads);
46 auto basic_mt_tracing = spdlog::basic_logger_mt("basic_mt/backtrace-on", "logs/basic_mt.log", true);
47 basic_mt_tracing->enable_backtrace(32);
48 bench_mt(iters, std::move(basic_mt_tracing), threads);
49
50 spdlog::info("");
51 auto rotating_mt = spdlog::rotating_logger_mt("rotating_mt", "logs/rotating_mt.log", file_size, rotating_files);
52 bench_mt(iters, std::move(rotating_mt), threads);
53 auto rotating_mt_tracing = spdlog::rotating_logger_mt("rotating_mt/backtrace-on", "logs/rotating_mt.log", file_size, rotating_files);
54 rotating_mt_tracing->enable_backtrace(32);
55 bench_mt(iters, std::move(rotating_mt_tracing), threads);
56
57 spdlog::info("");
58 auto daily_mt = spdlog::daily_logger_mt("daily_mt", "logs/daily_mt.log");
59 bench_mt(iters, std::move(daily_mt), threads);
60 auto daily_mt_tracing = spdlog::daily_logger_mt("daily_mt/backtrace-on", "logs/daily_mt.log");
61 daily_mt_tracing->enable_backtrace(32);
62 bench_mt(iters, std::move(daily_mt_tracing), threads);
63
64 spdlog::info("");
65 auto empty_logger = std::make_shared<spdlog::logger>("level-off");
66 empty_logger->set_level(spdlog::level::off);
67 bench(iters, empty_logger);
68 auto empty_logger_tracing = std::make_shared<spdlog::logger>("level-off/backtrace-on");
69 empty_logger_tracing->set_level(spdlog::level::off);
70 empty_logger_tracing->enable_backtrace(32);
71 bench(iters, empty_logger_tracing);
72}
73
74void bench_single_threaded(int iters)
75{
76 spdlog::info("**************************************************************");
77 spdlog::info(fmt::format(std::locale("en_US.UTF-8"), "Single threaded: {} messages", iters));
78 spdlog::info("**************************************************************");
79
80 auto basic_st = spdlog::basic_logger_st("basic_st", "logs/basic_st.log", true);
81 bench(iters, std::move(basic_st));
82
83 auto basic_st_tracing = spdlog::basic_logger_st("basic_st/backtrace-on", "logs/basic_st.log", true);
84 bench(iters, std::move(basic_st_tracing));
85
86 spdlog::info("");
87 auto rotating_st = spdlog::rotating_logger_st("rotating_st", "logs/rotating_st.log", file_size, rotating_files);
88 bench(iters, std::move(rotating_st));
89 auto rotating_st_tracing = spdlog::rotating_logger_st("rotating_st/backtrace-on", "logs/rotating_st.log", file_size, rotating_files);
90 rotating_st_tracing->enable_backtrace(32);
91 bench(iters, std::move(rotating_st_tracing));
92
93 spdlog::info("");
94 auto daily_st = spdlog::daily_logger_st("daily_st", "logs/daily_st.log");
95 bench(iters, std::move(daily_st));
96 auto daily_st_tracing = spdlog::daily_logger_st("daily_st/backtrace-on", "logs/daily_st.log");
97 daily_st_tracing->enable_backtrace(32);
98 bench(iters, std::move(daily_st_tracing));
99
100 spdlog::info("");
101 auto empty_logger = std::make_shared<spdlog::logger>("level-off");
102 empty_logger->set_level(spdlog::level::off);
103 bench(iters, empty_logger);
104
105 auto empty_logger_tracing = std::make_shared<spdlog::logger>("level-off/backtrace-on");
106 empty_logger_tracing->set_level(spdlog::level::off);
107 empty_logger_tracing->enable_backtrace(32);
108 bench(iters, empty_logger_tracing);
109}
110
111int main(int argc, char *argv[])
112{
114 spdlog::default_logger()->set_pattern("[%^%l%$] %v");
115 int iters = 250000;
116 size_t threads = 4;
117 try
118 {
119
120 if (argc > 1)
121 {
122 iters = std::stoi(argv[1]);
123 }
124 if (argc > 2)
125 {
126 threads = std::stoul(argv[2]);
127 }
128
129 if (threads > max_threads)
130 {
131 throw std::runtime_error(fmt::format("Number of threads exceeds maximum({})", max_threads));
132 }
133
135 bench_threaded_logging(1, iters);
136 bench_threaded_logging(threads, iters);
137 }
138 catch (std::exception &ex)
139 {
140 spdlog::error(ex.what());
141 return EXIT_FAILURE;
142 }
143 return EXIT_SUCCESS;
144}
145
147{
151
152 auto start = high_resolution_clock::now();
153 for (auto i = 0; i < howmany; ++i)
154 {
155 log->info("Hello logger: msg number {}", i);
156 }
157
158 auto delta = high_resolution_clock::now() - start;
159 auto delta_d = duration_cast<duration<double>>(delta).count();
160
162 fmt::format(std::locale("en_US.UTF-8"), "{:<30} Elapsed: {:0.2f} secs {:>16L}/sec", log->name(), delta_d, int(howmany / delta_d)));
163 spdlog::drop(log->name());
164}
165
166void bench_mt(int howmany, std::shared_ptr<spdlog::logger> log, size_t thread_count)
167{
171
173 threads.reserve(thread_count);
174 auto start = high_resolution_clock::now();
175 for (size_t t = 0; t < thread_count; ++t)
176 {
177 threads.emplace_back([&]() {
178 for (int j = 0; j < howmany / static_cast<int>(thread_count); j++)
179 {
180 log->info("Hello logger: msg number {}", j);
181 }
182 });
183 }
184
185 for (auto &t : threads)
186 {
187 t.join();
188 };
189
190 auto delta = high_resolution_clock::now() - start;
191 auto delta_d = duration_cast<duration<double>>(delta).count();
193 fmt::format(std::locale("en_US.UTF-8"), "{:<30} Elapsed: {:0.2f} secs {:>16L}/sec", log->name(), delta_d, int(howmany / delta_d)));
194 spdlog::drop(log->name());
195}
196
197/*
198void bench_default_api(int howmany, std::shared_ptr<spdlog::logger> log)
199{
200 using std::chrono::high_resolution_clock;
201 using std::chrono::duration;
202 using std::chrono::duration_cast;
203
204 auto orig_default = spdlog::default_logger();
205 spdlog::set_default_logger(log);
206 auto start = high_resolution_clock::now();
207 for (auto i = 0; i < howmany; ++i)
208 {
209 spdlog::info("Hello logger: msg number {}", i);
210 }
211
212 auto delta = high_resolution_clock::now() - start;
213 auto delta_d = duration_cast<duration<double>>(delta).count();
214 spdlog::drop(log->name());
215 spdlog::set_default_logger(std::move(orig_default));
216 spdlog::info("{:<30} Elapsed: {:0.2f} secs {:>16}/sec", log->name(), delta_d, int(howmany / delta_d));
217}
218
219void bench_c_string(int howmany, std::shared_ptr<spdlog::logger> log)
220{
221 using std::chrono::high_resolution_clock;
222 using std::chrono::duration;
223 using std::chrono::duration_cast;
224
225 const char *msg = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum pharetra metus cursus "
226 "lacus placerat congue. Nulla egestas, mauris a tincidunt tempus, enim lectus volutpat mi, eu consequat sem "
227 "libero nec massa. In dapibus ipsum a diam rhoncus gravida. Etiam non dapibus eros. Donec fringilla dui sed "
228 "augue pretium, nec scelerisque est maximus. Nullam convallis, sem nec blandit maximus, nisi turpis ornare "
229 "nisl, sit amet volutpat neque massa eu odio. Maecenas malesuada quam ex, posuere congue nibh turpis duis.";
230
231 auto orig_default = spdlog::default_logger();
232 spdlog::set_default_logger(log);
233 auto start = high_resolution_clock::now();
234 for (auto i = 0; i < howmany; ++i)
235 {
236 spdlog::log(spdlog::level::info, msg);
237 }
238
239 auto delta = high_resolution_clock::now() - start;
240 auto delta_d = duration_cast<duration<double>>(delta).count();
241 spdlog::drop(log->name());
242 spdlog::set_default_logger(std::move(orig_default));
243 spdlog::info("{:<30} Elapsed: {:0.2f} secs {:>16}/sec", log->name(), delta_d, int(howmany / delta_d));
244}
245
246*/
int main(int argc, char *argv[])
Definition bench.cpp:111
static const size_t rotating_files
Definition bench.cpp:35
static const size_t file_size
Definition bench.cpp:34
void bench_threaded_logging(size_t threads, int iters)
Definition bench.cpp:38
void bench_single_threaded(int iters)
Definition bench.cpp:74
void bench_mt(int howmany, std::shared_ptr< spdlog::logger > log, size_t thread_count)
Definition bench.cpp:166
void bench(int howmany, std::shared_ptr< spdlog::logger > log)
Definition bench.cpp:146
static const int max_threads
Definition bench.cpp:36
constexpr auto count() -> size_t
Definition core.h:1039
T duration_cast(T... args)
T emplace_back(T... args)
T make_shared(T... args)
std::shared_ptr< logger > rotating_logger_st(const std::string &logger_name, const filename_t &filename, size_t max_file_size, size_t max_files, bool rotate_on_open=false)
void error(fmt::format_string< Args... > fmt, Args &&...args)
Definition spdlog.h:167
std::shared_ptr< logger > daily_logger_st(const std::string &logger_name, const filename_t &filename, int hour=0, int minute=0, bool truncate=false, uint16_t max_files=0)
SPDLOG_INLINE void set_automatic_registration(bool automatic_registration)
Definition spdlog-inl.h:105
std::shared_ptr< logger > basic_logger_st(const std::string &logger_name, const filename_t &filename, bool truncate=false)
SPDLOG_INLINE std::shared_ptr< spdlog::logger > default_logger()
Definition spdlog-inl.h:110
void info(fmt::format_string< Args... > fmt, Args &&...args)
Definition spdlog.h:155
std::shared_ptr< logger > basic_logger_mt(const std::string &logger_name, const filename_t &filename, bool truncate=false)
SPDLOG_INLINE void drop(const std::string &name)
Definition spdlog-inl.h:90
std::shared_ptr< logger > rotating_logger_mt(const std::string &logger_name, const filename_t &filename, size_t max_file_size, size_t max_files, bool rotate_on_open=false)
std::shared_ptr< logger > daily_logger_mt(const std::string &logger_name, const filename_t &filename, int hour=0, int minute=0, bool truncate=false, uint16_t max_files=0)
T reserve(T... args)
T stoi(T... args)
T stoul(T... args)
T what(T... args)