c++的glog與spdlog的性能對(duì)比測(cè)試分析
問(wèn)題:
之前看到有的博文說(shuō)glog性能很好,效率很高,當(dāng)時(shí)第一反應(yīng)是“這個(gè)結(jié)論是幾幾年的?”,可惜博文都是各種抄襲和轉(zhuǎn)載,不容易找到結(jié)論出處,我一直很懷疑它的寫入吞吐性能。
之前作為學(xué)習(xí)優(yōu)秀的代碼案例,略看過(guò)glog的源代碼。它是線程同步的方式記錄和寫入,每次調(diào)用日志的地方都要?jiǎng)?chuàng)建和釋放日志器,確實(shí)在每次創(chuàng)建對(duì)象時(shí)并沒有創(chuàng)建額外緩存空間,而是復(fù)用第一次創(chuàng)建的內(nèi)存空間,這相比于每次創(chuàng)建申請(qǐng)新內(nèi)存而言,效率很高,難道高性能僅僅指這個(gè)?可惜我自己的C++水平也就是應(yīng)用程序開發(fā),暫時(shí)是沒有能力寫出這類高性能基礎(chǔ)工具庫(kù)的。
所以,不如直接運(yùn)行以下,從結(jié)果上比一比就知道。
測(cè)試內(nèi)容:
今天把spdlog日志庫(kù),也用了下,并且和glog做了簡(jiǎn)單對(duì)比。spdlog在引入到項(xiàng)目中的成本很低,只要引入頭文件,glog還需要配置下,如果是第一次,還需要額外編譯一個(gè)glog版本。
基于十萬(wàn)筆日志數(shù)據(jù),大概也就10MB不到。
測(cè)試結(jié)果如下,是在一臺(tái)低配的服務(wù)器上跑的,硬盤還是機(jī)械的scsi接口,后面給出測(cè)試代碼,程序代碼相同環(huán)境下運(yùn)行:
在同步調(diào)用的場(chǎng)景下,spdlog比glog快,spdlog耗時(shí)0.135秒,glog耗時(shí)1.027秒,簡(jiǎn)單異步spdlog耗時(shí)0.158秒,普通ofstream流寫入0.252秒。
另外,在自己開發(fā)環(huán)境的電腦上用的是固態(tài)硬盤,結(jié)果如下:
在同步調(diào)用的場(chǎng)景下,spdlog比glog快,spdlog耗時(shí)0.057秒,glog耗時(shí)0.475秒,簡(jiǎn)單異步spdlog耗時(shí)0.093秒,普通ofstream流寫入0.112秒。
測(cè)試環(huán)境:
winserver 2012, 非固態(tài)硬盤
VS2019 ,C++11,spdlog-1.x,glog
glog測(cè)試代碼如下:
#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異步測(cè)試代碼:
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流寫入測(cè)試代碼:
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();
總結(jié):
僅僅從調(diào)用性能上看,spdlog耗時(shí)略低于glog。調(diào)用耗時(shí)從低到高如下:
spdlog同步 < spdlog異步 < glog < 普通ofstream流
但是如果把計(jì)算機(jī)看作是工程化,則并不是簡(jiǎn)單追求性能的。我覺得工程有一個(gè)因素是投入產(chǎn)出比。實(shí)際上,在平常項(xiàng)目中,我也用的是glog居多,因?yàn)間log很多的LOG_IF這類宏用起來(lái)很方便,對(duì)于日志吞吐性能也足夠使用,而且默認(rèn)是dll方式使用,在多個(gè)獨(dú)立的組件dll之間可以使用同一個(gè)glog實(shí)例,只有少數(shù)模塊需要盡量減少日志寫入影響的地方,用了spdlog異步方式。
會(huì)不會(huì)是這個(gè)測(cè)試哪里錯(cuò)了?更多關(guān)于 c++ glog與spdlog性能對(duì)比的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹簡(jiǎn)單應(yīng)用
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉樹簡(jiǎn)單應(yīng)用的相關(guān)資料,需要的朋友可以參考下2017-05-05C++ 輸入一行數(shù)字(含負(fù)數(shù))存入數(shù)組中的案例
這篇文章主要介紹了C++ 輸入一行數(shù)字(含負(fù)數(shù))存入數(shù)組中的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12C++11右值引用和std::move語(yǔ)句實(shí)例解析(推薦)
右值引用(及其支持的Move語(yǔ)意和完美轉(zhuǎn)發(fā))是C++0x將要加入的最重大語(yǔ)言特性之一。這篇文章主要介紹了C++11右值引用和std::move語(yǔ)句實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03C語(yǔ)言利用EasyX實(shí)現(xiàn)繪制足球圖案
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何利用EasyX繪圖庫(kù)實(shí)現(xiàn)繪制一個(gè)簡(jiǎn)單的足球圖案,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-11-11C++ 創(chuàng)建桌面快捷方式 開始菜單的實(shí)現(xiàn)代碼
這篇文章介紹了C++ 創(chuàng)建桌面快捷方式,開始菜單的實(shí)現(xiàn)代碼,需要的朋友可以參考一下2013-06-06OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析
直方圖均衡化是通過(guò)拉伸像素強(qiáng)度分布范圍來(lái)增強(qiáng)圖像對(duì)比度的一種方法,今天通過(guò)本文給大家介紹OpenCV?直方圖均衡化的實(shí)現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧2022-01-01