網(wǎng)站首頁 編程語言 正文
問題:
之前看到有的博文說glog性能很好,效率很高,當時第一反應是“這個結論是幾幾年的?”,可惜博文都是各種抄襲和轉載,不容易找到結論出處,我一直很懷疑它的寫入吞吐性能。
之前作為學習優(yōu)秀的代碼案例,略看過glog的源代碼。它是線程同步的方式記錄和寫入,每次調用日志的地方都要創(chuàng)建和釋放日志器,確實在每次創(chuàng)建對象時并沒有創(chuàng)建額外緩存空間,而是復用第一次創(chuàng)建的內(nèi)存空間,這相比于每次創(chuàng)建申請新內(nèi)存而言,效率很高,難道高性能僅僅指這個?可惜我自己的C++水平也就是應用程序開發(fā),暫時是沒有能力寫出這類高性能基礎工具庫的。
所以,不如直接運行以下,從結果上比一比就知道。
測試內(nèi)容:
今天把spdlog日志庫,也用了下,并且和glog做了簡單對比。spdlog在引入到項目中的成本很低,只要引入頭文件,glog還需要配置下,如果是第一次,還需要額外編譯一個glog版本。
基于十萬筆日志數(shù)據(jù),大概也就10MB不到。
測試結果如下,是在一臺低配的服務器上跑的,硬盤還是機械的scsi接口,后面給出測試代碼,程序代碼相同環(huán)境下運行:
在同步調用的場景下,spdlog比glog快,spdlog耗時0.135秒,glog耗時1.027秒,簡單異步spdlog耗時0.158秒,普通ofstream流寫入0.252秒。
另外,在自己開發(fā)環(huán)境的電腦上用的是固態(tài)硬盤,結果如下:
在同步調用的場景下,spdlog比glog快,spdlog耗時0.057秒,glog耗時0.475秒,簡單異步spdlog耗時0.093秒,普通ofstream流寫入0.112秒。
測試環(huán)境:
winserver 2012, 非固態(tài)硬盤
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(" 創(chuàng)建basicFileLogger ");
auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic_log.txt");
logger->info("文件創(chuàng)建完畢。");
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流
但是如果把計算機看作是工程化,則并不是簡單追求性能的。我覺得工程有一個因素是投入產(chǎn)出比。實際上,在平常項目中,我也用的是glog居多,因為glog很多的LOG_IF這類宏用起來很方便,對于日志吞吐性能也足夠使用,而且默認是dll方式使用,在多個獨立的組件dll之間可以使用同一個glog實例,只有少數(shù)模塊需要盡量減少日志寫入影響的地方,用了spdlog異步方式。
原文鏈接:https://blog.51cto.com/ggwhsd/5308537
相關推薦
- 2023-01-30 delphi?判斷字符串是否為純數(shù)字組合_Delphi
- 2022-12-29 R語言apply系列函數(shù)實例詳解_R語言
- 2023-07-02 oracle實現(xiàn)根據(jù)字段分組排序,取其第一條數(shù)據(jù)_oracle
- 2022-07-17 C++深入講解namespace與string關鍵字的使用_C 語言
- 2024-02-16 springmvc中的數(shù)據(jù)提交方式
- 2022-11-05 Swift運算符使用方法淺析_Swift
- 2022-11-21 Go語言讀寫鎖RWMutex的源碼分析_Golang
- 2022-09-26 Mybatis的一級緩存和二級緩存及其區(qū)別
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支