Chinaunix首页 | 论坛 | 博客
  • 博客访问: 573721
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:21:25

1 现象:问题描述
话单预处理程序无法达到性能要求。按照设计要求,需要系统单线程每秒处理300条,但是实际处理条数只有200多条每秒。
2 关键过程:根本原因分析
经过在Solaris平台上使用Quantify工具分析,发现底层有一个函数占用接近40%的CPU处理时间,这是一个处理电话号码的函数,该函数部分代码如下:
 if(NO_PREFIX == nFlag)
 {
  memset( szBuf, 0, sizeof(szBuf) );
 }
 
 if( NULL==pcTelNumIn)
 {
  return FAIL;
 }
 
 strcat( szBuf, pcTelNumIn);
 iTelLen = strlen(szBuf); //szBuf: 纯电话号码
问题就出在兰色字体标识的部分,szBuf是一个系统分配的缓存变量,内存空间大约100K,memset( szBuf, 0, sizeof(szBuf) )会刷新整个内存区域,导致占用大量的CPU时间。
3 结论:解决方案及效果
C语言中字符串实际是以'\0'字符进行结尾标识的,如果是一个标准的ASCII字符串应用,而且使用的是str系列的函数,完全可以用对字符串第一个字符赋值为'\0'的方法来代替全量字符串的刷新处理。
问题代码更新如下:
 if(NO_PREFIX == nFlag)
 {
  szBuf[0] = 0;
 }
 
 if( NULL==pcTelNumIn)
 {
  return FAIL;
 }
 
 strcat( szBuf, pcTelNumIn);
 iTelLen = strlen(szBuf); //szBuf: 纯电话号码问题就出在兰色字体标识的部分
进行更新后,系统话单处理速度提高到了单线程350条每秒,问题得以解决。
4 经验总结:预防措施和规范建议
C语言中的字符串处理非常常见,一个好的方法可以大大提高系统的整体效率。可以在开发前对一些字符串处理的要求进行规范约束,比如这个初始化的方法。
需要注意的是,并非所有的情况都能够运用初始位置赋值替代memset的,在大量使用字符串位运算或mem系列的运算符时,为了减少出错,还是需要使用memset对字符串内存空间进行初始设置。
5 备注
6 考核点
如何正确高效的对字符串进行初始化操作。
7 试题
#define MAX_LEN 4096
#define MAX_LINE 4096
char szBuf[MAX_LEN];
char szLine[MAX_LINE];
FILE *pf;
_____________________

while(1)
{
 if(feof(pf))
 {
  break;
 }
 …
 if(fgets(szLine, MAX_LINE, pf) != NULL)
 {
  strncat(szBuf, szLine, MAX_LEN - 1 - strlen(szBuf)); 
    …
 }
}
上面这段段代码下划线处要进行szBuf的初始化操作,请选择正确而且效率最高语句(C)
A、 memset(szBuf,0,sizeof(szBuf));
B、 memset(szBuf,0,MAX_LEN);
C、 szBuf[0]=0;
D、 szBuf[MAX_LEN-1]=0;
阅读(411) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~