道哥的第 025 篇原創(chuàng)- 一、前言
- 二、最簡(jiǎn)單的格式化
- 三、測(cè)試1:手動(dòng)格式化數(shù)字
- 四、測(cè)試2:混合格式化字符串和數(shù)字
- 五、sprintf 的實(shí)現(xiàn)機(jī)制
- 六、總結(jié)
一、前言
在嵌入式項(xiàng)目開發(fā)中,
字符串格式化是很常見的操作,我們一般都會(huì)使用 C 庫(kù)中的
sprintf 系列函數(shù)來完成格式化。從功能上來說,這是沒有問題的,但是在一些
時(shí)間關(guān)鍵場(chǎng)合,字符串的格式化
效率會(huì)對(duì)整個(gè)系統(tǒng)產(chǎn)生顯著的影響。例如:在一個(gè)日志系統(tǒng)中,
吞吐率是一個(gè)重要的性能指標(biāo)。每個(gè)功能模塊都產(chǎn)生了大量的日志信息,日志系統(tǒng)需要把
時(shí)間戳添加到每條日志的頭部,此時(shí)字符串的格式化效率就比較關(guān)鍵了。
天下武功,唯快不破!這篇文章就專門來聊一聊把數(shù)字格式化成
字符串,可以有什么更好的方法。也許技術(shù)含量不高,但是
很實(shí)用!二、最簡(jiǎn)單的格式化
#include
#include
#include
#include
int main()
{
char buff[32] = { 0 };
sprintf(buff, "%ld", LONG_MAX);
printf("buff = %s \n", buff);
}
其中,
LONG_MAX 表示 long 型數(shù)值的最大值。代碼在眨眼功夫之間就執(zhí)行結(jié)束了,但是如果是
一百萬(wàn)、一千萬(wàn)次呢?
三、測(cè)試1:手動(dòng)格式化數(shù)字
1. 獲取系統(tǒng)時(shí)間戳函數(shù)
我的測(cè)試環(huán)境是:在 Win10 中通過 VirtualBox,安裝了 Ubuntu16.04 虛擬機(jī),使用系統(tǒng)自帶的 gcc 編譯器。為了測(cè)試代碼執(zhí)行的
耗時(shí),我們寫一個(gè)簡(jiǎn)單的函數(shù):獲取系統(tǒng)的時(shí)間戳,通過計(jì)算時(shí)間差值來看一下代碼的執(zhí)行速度。
// 獲取系統(tǒng)時(shí)間戳
long long getSysTimestamp()
{
struct timeval tv;
gettimeofday(