c++的glog与spdlog的性能对比测试分析

 更新时间:2022年05月20日 11:21:34   作者:文先生爱学习  
这篇文章主要为大家介绍了c++的glog与spdlog的性能对比测试分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题:

之前看到有的博文说glog性能很好,效率很高,当时第一反应是“这个结论是几几年的?”,可惜博文都是各种抄袭和转载,不容易找到结论出处,我一直很怀疑它的写入吞吐性能。

之前作为学习优秀的代码案例,略看过glog的源代码。它是线程同步的方式记录和写入,每次调用日志的地方都要创建和释放日志器,确实在每次创建对象时并没有创建额外缓存空间,而是复用第一次创建的内存空间,这相比于每次创建申请新内存而言,效率很高,难道高性能仅仅指这个?可惜我自己的C++水平也就是应用程序开发,暂时是没有能力写出这类高性能基础工具库的。

所以,不如直接运行以下,从结果上比一比就知道。

测试内容:

今天把spdlog日志库,也用了下,并且和glog做了简单对比。spdlog在引入到项目中的成本很低,只要引入头文件,glog还需要配置下,如果是第一次,还需要额外编译一个glog版本。

基于十万笔日志数据,大概也就10MB不到。

测试结果如下,是在一台低配的服务器上跑的,硬盘还是机械的scsi接口,后面给出测试代码,程序代码相同环境下运行:

在同步调用的场景下,spdlog比glog快,spdlog耗时0.135秒,glog耗时1.027秒,简单异步spdlog耗时0.158秒,普通ofstream流写入0.252秒。

另外,在自己开发环境的电脑上用的是固态硬盘,结果如下:

在同步调用的场景下,spdlog比glog快,spdlog耗时0.057秒,glog耗时0.475秒,简单异步spdlog耗时0.093秒,普通ofstream流写入0.112秒。

测试环境:

winserver 2012, 非固态硬盘

VS2019 ,C++11,spdlog-1.x,glog

glog测试代码如下:

#pragma once
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <spdlog/spdlog.h>
#include <logging.h>
#include <thread>
#include <spdlog/stopwatch.h>
using namespace google;
#ifdef _DEBUG
#pragma comment(lib, "glogd.lib")
#else
#pragma comment(lib, "glog.lib")
#endif // DEBUG
void testGlog2()
{
  int i = 0;
  spdlog::stopwatch sw;
  while (i < 100 * 1000)
  {
    LOG(INFO) << "async logger";
    i++;
  }
  LOG(INFO) << "testGlog Elapsed " << sw.elapsed().count();
}
void testGlog()
{
  // Start google log system:
  FLAGS_log_dir = ".\\log\\";
  google::InitGoogleLogging("loglog");
  google::SetLogDestination(google::GLOG_INFO, ".\\logs\\glog");
  google::SetStderrLogging(google::GLOG_FATAL);
  google::SetLogFilenameExtension("log_");
  FLAGS_colorlogtostderr = true;  // Set log color
  FLAGS_logbufsecs = 5;  // Set log output speed(s)
  FLAGS_max_log_size = 50;  // Set max log file size
  FLAGS_stop_logging_if_full_disk = true;  // If disk is full
  std::thread* t = new std::thread(testGlog2);
  t->join();
  google::ShutdownGoogleLogging();
}

spdlog异步测试代码:

spdlog::info(" 创建basicFileLogger ");
        auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic_log.txt");
        logger->info("文件创建完毕。");
        logger->set_pattern("[%Y-%m-%d %H:%M:%S.%f %z][thread %t][%n][%l]: %v");
        int i = 0;
        spdlog::stopwatch sw;
        while (i < 100 * 1000)
        {
            logger->info("basic_logger_mt logger");
            i++;
        }
        logger->info("asyncExample Elapsed {:.7}", sw);

普通io流写入测试代码:

ofstream logger;
  logger.open("logs/fopen.txt", std::ios::out);
  int i = 0;
  spdlog::stopwatch sw;
  while (i < 100 * 1000)
  {
    logger << asctime(& spdlog::details::os::gmtime()) <<__FUNCTION__ << " "<<__LINE__ <<" " << ("async logger") <<"\r\n";
    i++;
  }
  logger<<"asyncExample Elapsed "<< sw.elapsed().count();
  logger.close();

总结:

仅仅从调用性能上看,spdlog耗时略低于glog。调用耗时从低到高如下:

spdlog同步 < spdlog异步 < glog < 普通ofstream流

但是如果把计算机看作是工程化,则并不是简单追求性能的。我觉得工程有一个因素是投入产出比。实际上,在平常项目中,我也用的是glog居多,因为glog很多的LOG_IF这类宏用起来很方便,对于日志吞吐性能也足够使用,而且默认是dll方式使用,在多个独立的组件dll之间可以使用同一个glog实例,只有少数模块需要尽量减少日志写入影响的地方,用了spdlog异步方式。

会不会是这个测试哪里错了?更多关于 c++ glog与spdlog性能对比的资料请关注脚本之家其它相关文章!

相关文章

  • C语言中对数组赋值的三种形式

    C语言中对数组赋值的三种形式

    这篇文章主要给大家介绍了关于C语言中对数组赋值的3种形式,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • C语言数据结构二叉树简单应用

    C语言数据结构二叉树简单应用

    这篇文章主要介绍了C语言数据结构二叉树简单应用的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++ 输入一行数字(含负数)存入数组中的案例

    C++ 输入一行数字(含负数)存入数组中的案例

    这篇文章主要介绍了C++ 输入一行数字(含负数)存入数组中的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C++11右值引用和std::move语句实例解析(推荐)

    C++11右值引用和std::move语句实例解析(推荐)

    右值引用(及其支持的Move语意和完美转发)是C++0x将要加入的最重大语言特性之一。这篇文章主要介绍了C++11右值引用和std::move语句实例解析,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • C++11中delete和default的用法详解

    C++11中delete和default的用法详解

    这篇文章主要为大家详细介绍了C++11中delete和default的具体用法,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的小伙伴可以了解下
    2023-08-08
  • C++利用递归实现走迷宫

    C++利用递归实现走迷宫

    这篇文章主要为大家详细介绍了C++利用递归实现走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C语言利用EasyX实现绘制足球图案

    C语言利用EasyX实现绘制足球图案

    这篇文章主要为大家详细介绍了C语言如何利用EasyX绘图库实现绘制一个简单的足球图案,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-11-11
  • C语言实现发牌洗牌

    C语言实现发牌洗牌

    这篇文章主要为大家详细介绍了C语言实现发牌洗牌,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++ 创建桌面快捷方式 开始菜单的实现代码

    C++ 创建桌面快捷方式 开始菜单的实现代码

    这篇文章介绍了C++ 创建桌面快捷方式,开始菜单的实现代码,需要的朋友可以参考一下
    2013-06-06
  • OpenCV 直方图均衡化的实现原理解析

    OpenCV 直方图均衡化的实现原理解析

    直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法,今天通过本文给大家介绍OpenCV 直方图均衡化的实现原理解析,感兴趣的朋友跟随小编一起看看吧
    2022-01-01

最新评论