用检查点测试程序瓶颈
时间:2010-10-27 来源:soaringdream
在程序中增加检查点(Check Point)来确定程序性能的瓶颈是个常用而简单的方法。鉴于在项目中碰到过这个问题,在这里做个归纳总结。只能算个小知识点吧。
在说这个问题之前,首先明确一下性能测试的概念。像我们做的电信的系统一般都是对系统的性能非常重视的。项目在客户方面会进行非常严格的性能测试。因此平时写代码的时候就应该尽量考虑到对性能的影响。性能测试主要是通过自动化的测试工具模拟多种正常、峰值及异常负载来对系统的各项性能指标进行测试。一般来说,性能测试可概括为三个方面:在客户端性能的 测试、在网络上性能的测试和在服务器端性能的测试。通常情况下,三方面有效的结合可以达到对系统性能全面的分析和瓶颈的预测。性能测试的基本策略是自动负载和压力测试。通过在一台或几台PC机上模拟成百上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务 处理的时间、服务器峰值数据、数据库状态等。它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。
在我们这个项目中,就是客户通过测试发现系统的处理时间相对之前的系统速度慢很多。因此发现系统中存在性能问题,但是具体的问题代码的地方不能确定。那应该怎么办呢?于是决定通过设定检查点的方法来找到存在性能问题的代码?
那么,如此大的系统,这么多行的代码,究竟应该怎么样去合理的设置检查点呢?这里就需要了解程序的处理逻辑,里面有一些主要的步骤,我们就在主要处理步骤开始与结束的地方分别设置检查点,这里尤其是自己估计可能出问题的地方更要多设置一些。最后通过这些检查点运行处理的时间来看究竟是什么地方发生了问题,消耗了大量的处理时间,以此来准确定位发生问题的代码并找到原因,然后加以修改。其实最后发生问题的可能只有某个或某几个地方。因为程序的性能瓶颈通常也是符合80/20理论的。就是说百分之八十的问题通常出现在百分之二十的代码里面。
具体的处理如下:
首先定义函数void GetTimeStampCommon(char *result);
void GetTimeStampCommon(char *result)
{
struct timeval tm_cur = {0, 0};
unsigned int ui_time = 0;
gettimeofday(&tm_cur, 0);
ui_time = (unsigned int)tm_cur.tv_sec * 1000000 + tm_cur.tv_usec;
sprintf(result,"%u",ui_time);
}
然后,我们定义一个数组char sCheckTimeStamp[LOGTYPESIZE];
在每一个检查点调用GetTimeStampCommon函数,将时间字符串保持在数组里面的一个成员里面。
最后,在所有的检查点过后,通过循环,将数组里面的字符串拼接起来。
for(iLogCount = 0; iLogCount < LOGTYPESIZE; iLogCount++)
{
strncpy(……);
}
然后通过log函数将字符串输出到log里面以方便查看并定位问题发生的地方。通过这个方法,就可以准确定位发生性能问题的代码的地方并最终解决程序的性能问题。