我最近从 Boost Log 切换到 Spdlog 以获得所谓的速度优势。
但是,当我比较切换前后的运行时间时,我发现 Boost Log 明显更快。我想知道我是否对导致速度减慢的 spdlog 做错了什么,或者 Boost::Log 是否真的是更快的解决方案。
我的应用程序是单线程的,使用 -O3 和 -flto 编译,我使用的是 Boost 1.69.0 和 Spdlog 1.3.1。我的 Boost::Log 运行时间约为 37 秒,Spdlog 为 1m22s,Spdlog-async 为 2m22。我的日志条目通常是使用 nlohmann/json 库(我知道这不是最快的)用 json 制作的大约 80 个字符,并且我有 3 个不同的记录器,每个记录器都针对自己的文件。
升压设置:
#include <boost/log/common.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/sinks/async_frontend.hpp>
#include <boost/log/sinks/text_file_backend.hpp>
#include <boost/parameter/keyword.hpp>
auto backend = boost::make_shared<sinks::text_file_backend>(keywords::file_name = logfile);
backend->auto_flush(true);
auto sink = boost::make_shared<sinks::asynchronous_sink<sinks::text_file_backend>>(backend);
sink->set_filter(expressions::attr<std::string>("Channel") == "logger_name);
boost::log::core::get()->add_sink(sink);
在代码的其他地方,我声明了一个记录器
boost::log::sources::channel_logger<> logger(boost::log::keywords::channel = "logger_name");
BOOST_LOG(logger) << "some json string";
Spdlog 设置:
#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
auto file_logger = spdlog::basic_logger_st("logger_name", "filename", true);
//I've tried an async logger, but it is even slower!
// auto file_logger = spdlog::basic_logger_st<spdlog::async_factory>("logger_name", "filename", true);
file_logger->set_pattern("%v");
并使用:
std::shared_ptr<spdlog::logger> logger(spdlog::get("logger_name"));
logger->info("some json string");
任何意见,将不胜感激。
编辑
通过在创建任何异步记录器之前添加,我能够稍微提高性能
spdlog::init_thread_pool(1024*1024, 4);
,但性能仍然是 Boost Log 的一半左右。