关注性能仍是程序员的职责
来源:互联网 发布:android 网络编程原理 编辑:程序博客网 时间:2024/05/03 10:02
现在计算机的硬件设备的性能增长速度异常迅猛,使得越来越多的程序员开始不再关注代码的执行效率,不再花费心思去构想精妙的算法,优化自己的代码,导致设计的系统越来越庞大、越来越复杂,性能却越来越差,程序员自己也逐渐沦落为蓝领技术工人。一个经过简单编码培训的人就可以胜任程序员的工作吗?我认为不是这样的。一个合格的程序员,除熟练掌握多种编程语言外,创造力才是程序员生命的源泉。而创造力并非天生的,需要丰富的经验加勤奋的思考。本文并非想探讨程序员的成长,只是将此作为引子,希望各位同仁能关注自己编写代码并能为之自豪,并以一个简单的例子说明关注代码优化问题导致的巨大性能提升。即使机器再好,一个编写不良的代码,依然难以达到理想的性能。
今天测试人员向我抱怨,说我们提交的API代码性能比较差,解析一个90万笔业务的报文居然用了9个小时,这当然是不能接受的。我自己简单测试下,发现在我的T43/1.5G机器上,API的解析速度只能达到每秒30笔,直观觉得代码应存在性能问题。我仔细查阅了程序,没有发现明显的问题。到底是什么导致性能损失的呢?我逐步跟踪每步代码的执行,终于找到了问题所在,简单地讲此性能问题是频繁调用函数strlen()导致的。各位可能非常惊讶,我当时也很惊讶,但情况确实如此。90万笔业务的报文长度约50M,解析报文时我们调用了自己编写的底层代码StrStrExt()替换系统的strstr()以便支持的GB18030汉字,而性能正是StrStrExt()底层函数导致的。
先看看原始的StrStrExt()函数的代码:
char* StrStrExt(LPCSTR sSearch,LPCSTR sFind)
{
if (IsEmptyStr(sSearch)) return NULL;
if (IsEmptyStr(sFind)) return (char*)sSearch;
ULONG nOffset =0;
ULONG nIndex =0;
ULONG nMaxLen = strlen(sSearch);
ULONG nLen = strlen(sFind);
while(nOffset < nMaxLen)
{
for(nIndex=0; nIndex<nLen; nIndex ++)
{
if(sSearch[nOffset + nIndex] != sFind[nIndex]) break;
}
if(nIndex == nLen) return (char*)(sSearch + nOffset);
int n = IsChineseChar(sSearch + nOffset);
if(n > 0)
{
// 汉字处理
nOffset += n;
}
else
{
nOffset++;
}
}
return NULL;
}
发现strlen()对大字符串可能导致性能问题后,我将该函数修改如下:
{
if (IsEmptyStr(sSearch)) return NULL;
if (IsEmptyStr(sFind)) return (char*)sSearch;
ULONG nOffset =0;
ULONG nIndex =0;
// ULONG nMaxLen = strlen(sSearch);
ULONG nLen = strlen(sFind);
// while(nOffset < nMaxLen)
while(sSearch[nOffset] != 0)
{
for(nIndex=0; nIndex<nLen; nIndex ++)
{
if(sSearch[nOffset + nIndex] != sFind[nIndex]) break;
}
if(nIndex == nLen) return (char*)(sSearch + nOffset);
int n = IsChineseChar(sSearch + nOffset);
if(n > 0)
{
// 汉字处理
// nOffset += n;
for(int ii=0; ii<n; ii++)
{
++nOffset;
if(sSearch[nOffset] == 0) break;
}
}
else
{
nOffset++;
}
}
return NULL;
}
新函数与原函数的唯一差别是不再使用strlen()去获取串的结束位置,而是直接通过/0结束符判断串的结束位置。修改后的代码在我T43的机器上,解析速度提高到每秒3000笔的速度,是原代码的近100倍,达到了系统性能指标的要求。
这个问题提示我们,程序员应时刻关注代码的性能问题,对核心代码编写者更是如此。
- 关注性能仍是程序员的职责
- 程序员是这样炼成的(19)-关注过程
- XP SP3性能提升10% 仍是Vista最大竞争对手
- 关注 程序员的爱情 关注 苏生
- 挫折是必然的,未来仍光明
- 别再只关注骁龙845的性能了,因为它真正重要的是这些
- 关注性能: 异常的异常
- 关注性能: 引用对象(对象引用是怎样严重影响垃圾收集器的)
- 性能测试需要关注的性能点
- 程序员值得关注的网站
- QA的职责是人还是流程
- 女人的操作系统和程序员的职责
- 程序工作--关注产品性能而不仅是功能
- 关注性能: 确定更改的风险
- 关注性能: 改进您的开发过程
- 关注性能: 改进您的开发过程
- 后台编程要关注的性能
- 性能测试关注的mysql变量
- hashset于treeset的区别
- 求解 关于 套汇问题 要求 使用 C++
- 再说信号signal
- 树上10只鸟,开枪打死1只,还剩几只?
- [转]IT公司面试
- 关注性能仍是程序员的职责
- 数组-合并数组
- FreeBSD的0day终于出补丁了。
- samba快速入门
- Sqlserver中百万数据随机提取的问题
- 09.1.19
- 09.2.5
- 数组-删除重复数据
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名