我最近从Boost Log切换到Spdlog以获得声称的速度优势。
但是,当我比较切换前后的运行时时,我发现Boost Log明显更快。我想知道我是不是使用导致速度变慢的spdlog做错了,还是Boost :: Log确实是更快的解决方案。
我的应用程序是单线程的,使用-O3和-flto编译,并且我使用的是Boost 1.69.0和Spdlog 1.3.1。 我在Boost :: Log上的运行时间约为37s,其中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的一半。