海是我向往的地方,吸纳和咆哮是他的魅力!!!

51Testing系列丛书连载:性能测试从零开始——LoadRunner入门(四)

上一篇 / 下一篇  2008-06-20 16:24:48

51Testing系列丛书连载:性能测试从零开始——LoadRunner入门(四)

1.1.5  软件人员眼里的软件性能
        用户恨不能让软件有无限的性能,但作为软件技术人员,我们需清楚地认识到,那种理想化的要求是不可能的。在软件性能方案中,没有什么万能钥匙,软件性能方案充满了辩证的各种矛盾。每种方案和方法几乎都有利有弊。只有把握设计系统的具体环境,明确设计目标,具体问题具体分析,合理平衡各种矛盾,牢牢抓住主要矛盾,才能产生出优化的软件系统性能方案。
在上面的分析中,我们得知软件性能是软件运行空间和时间综合考虑的解决方案。那么其实满足用户的性能需求,只有以下几种方案:
1.消除软件对空间和时间不必要的浪费
        一个最明显的例子就是内存泄漏问题,它被开发人员看做是大忌。
        严格地说,内存泄漏应该属于软件程序设计的一种缺陷,该缺陷直接导致了程序在运行过程中无法释放不再需要的内存空间,从而造成内存资源浪费,严重的会造成无可用内存,导致系统崩溃。具体来说,当用户程序在运行过程中需要动态获得内存时,操作系统总是从堆(heap)上分配相应的空间给应用,分配的结果是将该堆内存的起始地址通过指针返回给应用。正常情况下,使用完这块内存后,应通过系统调用主动通知操作系统回收这些堆内存以便重用。但是,如果由于设计缺陷导致在某些情况下程序没有主动地通知到操作系统,而后应用又失去了对这块内存的引用时,则该堆内存块将成为既不受程序控制,又不能被系统回收重用的“孤儿”内存,这便是我们所指的内存泄漏。
  案例1
void foo( )
{
   char *str;
   str = (char*)malloc(32*sizeof(char)); 
   strcpy(str, "hello world");
   return;
  /* str所指向的32个字节的内存没有被释放,当foo()返回时造成内存泄漏 */
}
解决:C语言中malloc和free函数要配对使用。
  案例2
void foo()
{
//定义string1指针,其指向一个堆上的100个字节的内存空间
char *string1 = (char*)malloc(100*sizeof(char));
//定义string2指针,其指向一个堆上的200个字节的内存空间
char *string2 = (char*)malloc(200*sizeof(char));
scanf("%s", string2);
string1=string2;/*string1原先指向的100个字节的内存没有被释放*/
/*而后又被指向string2所指的内存块,造成前面100个字节的内存泄漏*/
free(string2);
free(string1); /* 这个free()调用会失败,因为string1指向的内存地址与string2的相同,而那块内存已经被释放了 */
return 0;
}
        解决:在程序堆上分配内存后,要在使用完后及时释放,同时避免野指针的产生,比如string1。
        原理:内存是软件运行的重要的空间资源,内存泄漏实际上是浪费了软件的空间资源。因此,内存泄漏对软件的性能影响十分重要。
        另外,对于程序在时间上的浪费,我们通常是采用优化算法和数据结构的解决策略。
  案例3
        最近几年,很多知名软件公司在招聘软件测试人员,考察代码能力的时候,内存泄露和算法优化是经常的试题之一。这说明了用户对软件性能的要求越来越严格,已经传递到了软件公司。

TAG:

 

评分:0

我来说两句

Open Toolbar