Spdlog намного медленнее, чем Boost Log - PullRequest
2 голосов
/ 21 мая 2019

Я недавно переключился с Boost Log на Spdlog для предполагаемых преимуществ по скорости.

Однако, когда я сравнил время выполнения до и после переключения, я обнаружил, что Boost Log значительно быстрее.Мне интересно, если я делаю что-то не так с spdlog, который вызывает замедление или Boost :: Log действительно является более быстрым решением.

Мое приложение однопоточное, скомпилированное с -O3 и -flto,и я использую Boost 1.69.0 и Spdlog 1.3.1.У меня время выполнения с Boost :: Log составляет около 37 с, у Spdlog - 1 м22, а у Spdlog-async - 2 м 22.Мои записи в журнале обычно содержат около 80 символов и сделаны с помощью json с использованием библиотеки nlohmann / json (которая, я знаю, не самая быстрая), и у меня есть 3 различных регистратора, каждый из которых предназначен для своего собственного файла.

Boost Setup:

#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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...