一、前言在嵌入式项目开发中,字符串格式化是一个很常见的操作,我们一般会用到sprintf系列函数在C库中完成格式化。从功能的角度来看,这没什么问题,但是在一些时间紧迫的场合,字符串的格式化效率会对整个系统产生很大的影响。例如:在一个日志系统中,吞吐量是一个重要的性能指标。每个功能模块都会产生大量的日志信息,日志系统需要在每条日志的头部加上时间戳。这时候字符串的格式化效率就比较关键了。武侠世界,唯快不破!本文专门讨论将数字格式化为字符串,以及有什么更好的方法。可能技术含量不高,但是很实用!二、最简单的格式#include#include#include#includeintmain(){charbuff[32]={0};sprintf(buff,"%ld",LONG_MAX);printf("buff=%s\n",buff);}其中,LONG_MAX表示long值的最大值。代码一眨眼就执行完了,但是100万、1000万次呢?三、测试一:手动格式化数字1、获取系统时间戳函数我的测试环境是:通过Win10VirtualBox,安装Ubuntu16.04虚拟机,使用系统自带的gcc编译器。为了测试代码执行的耗时,我们写了一个简单的函数:获取系统的时间戳,通过计算时间差来查看代码的执行速度。//获取系统时间戳longlonggetSysTimestamp(){structtimevaltv;gettimeofday(&tv,0);longlongts=(longlong)tv.tv_sec*1000000+tv.tv_usec;returns;}2.实现格式化数字的功能//buff:format格式化后的字符串存储地址;//value:需要格式化的数字voidLong2String(char*buff,longvalue){longtmp;chartmpBuf[32]={0};//p指向临时数组的最后一个位置char*p=&tmpBuf[sizeof(tmpBuf)-1];while(value!=0){tmp=value/10;//把一个数转换成ASCII码放到p指向的位置。//然后p向前移动一个位置。*--p=(char)('0'+(value-tmp*10));value=tmp;}//将临时数组中的每个字符复制到buff中。while(*p)*??buff++=*p++;}这个函数的过程很简单,从数字后面开始,把每个数字转换成ASCII码,放到一个临时数组中(也是从后往前放),最后统一复制到形参指针buff指向的空间。3.测试代码intmain(){printf("longsize=%d,LONG_MAX=%ld\n",sizeof(long),LONG_MAX);//测试1000万次inttotal=1000*10000;charbuff1[32]={0};charbuff2[32]={0};//测试sprintflonglongstart1=getSysTimestamp();for(inti=0;i