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

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

目录

问题:

测试内容:

测试环境:

glog测试代码如下:

spdlog异步测试代码:

普通io流写入测试代码:

总结:

问题:

之前看到有的博文说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性能对比的资料请关注易知道(ezd.cc)其它相关文章!

推荐阅读

    学习写字楼新选择6000元主流配置

    学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办公和娱乐平台,充分考虑办公室的办公需求和娱乐需求,以约6000元的预算和cost-e

    提高3A四核羿龙II游戏配置的性能

    提高3A四核羿龙II游戏配置的性能,,以节能环保为主题的IT产业,目前3A低端平台处理器、主板芯片组、独立开发卡性能突出,特别是在与AMD的处理

    优化PostgreSQL中的批量更新性能

    优化PostgreSQL中的批量更新性能,数据,表格,在Ubuntu 12.04上使用PG 9.1. 我们目前需要24小时才能运行大量UPDATE数据库上的语句,其形式

    诺基亚威图性能好到哪里

    诺基亚威图性能好到哪里,诺基亚,手机,诺基亚威图性能好到哪里这是一部以前列出的手机。即使当时配置不高,该品牌的手机也不依赖于该功能吸

    魅蓝note6性能参数有哪些

    魅蓝note6性能参数有哪些,摄像头,蓝牙,魅蓝note6性能参数有哪些魅力蓝色Note6最好拍照。电池寿命更长。蓝色Note6使用高通 snapdragon 625

    Lucene学习之高亮显示

    Lucene学习之高亮显示,索引,字符,在搜索引擎中我们经常会看到这样的情景: 红色部分我们称之为高亮显示,lucene提供了HighLighter模块来实

    国产电脑cpu测试|国产CPU性能

    国产电脑cpu测试|国产CPU性能,,国产CPU性能天玑9000答: 天玑9000更厉害。因为天玑9000是 最新发布的cpu,也是现在的天花板。而麒麟9000是 2

    主流电脑cpu性能分析|cpu性能对比表

    主流电脑cpu性能分析|cpu性能对比表,,1. cpu性能对比表一、参数对比1、r7 5800H:制程工艺为7nm,主频3.2GHz,睿频4.4GHz,线程数是8核16线程,45W

    新老酷睿i3性能对比试验i34130和i33220

    新老酷睿i3性能对比试验i34130和i33220,,新的英特尔酷睿i3-4130 Haswell处理器架构已经推出了很长一段时间,虽然市场的时间还不长,已经成为