学习积累再学习再积累~~~
喜欢下雨……特别喜欢坐在窗边安静的听雨、看书或者发呆
读书笔记(二) 之 如何提高软件性能
上一篇 /
下一篇 2008-07-28 21:33:01 / 天气: 大风
/ 心情: 平静
/ 个人分类:性能测试
\a6RZ\D4y5H0 用户恨不能让软件有无限的性能,但作为软件技术人员,我们需清楚地认识到,那种理想化的要求是不可能的。51Testing软件测试网N:KG/|;]
51Testing软件测试网 |e1MS
~ 在上面的分析中,我们得知软件性能是软件运行空间和时间综合考虑的解决方案。那么其实满足用户的性能需求,只有以下3种方案:51Testing软件测试网S
fJ'z^
51Testing软件测试网Z0YBD5q.u 1.消除软件对空间和时间不必要的浪费51Testing软件测试网sm8[
aILl
一个最明显的例子就是内存泄漏问题,它被开发人员看做是大忌。
h}.ql#mVn
H2g0 严格地说,内存泄漏应该属于软件程序设计的一种缺陷,该缺陷直接导致了程序在运行过程中无法释放不再需要的内存空间,从而造成内存资源浪费,严重的会造成无可用内存,导致系统崩溃。具体来说,当用户程序在运行过程中需要动态获得内存时,操作系统总是从堆(heap)上分配相应的空间给应用,分配的结果是将该堆内存的起始地址通过指针返回给应用。正常情况下,使用完这块内存后,应通过系统调用主动通知操作系统回收这些堆内存以便重用。但是,如果由于设计缺陷导致在某些情况下程序没有主动地通知到操作系统,而后应用又失去了对这块内存的引用时,则该堆内存块将成为既不受程序控制,又不能被系统回收重用的“孤儿”内存,这便是我们所指的内存泄漏。
i#X V!R,L|6I g0 案例151Testing软件测试网4N3Q(j&g?N
void foo( )51Testing软件测试网Ma/J ^a8A
{51Testing软件测试网&[%hSM~%YX
char *str;
V O:^x5B0 str = (char*)malloc(32*sizeof(char));
pP~Gc n0 strcpy(str, "hello world");51Testing软件测试网[:R @/AA:t
return;
~|;i)C8\KbtA0 /* str所指向的32个字节的内存没有被释放,当foo()返回时造成内存泄漏 */
.w4i&G7~`'L `:x0}51Testing软件测试网%NA]FigC L^
解决:C语言中malloc和free函数要配对使用。51Testing软件测试网1v;_!l-~&b+f2X\&g3JC{ {
案例2
] OV3d%iK~?cs0void foo()51Testing软件测试网A~^:qA%[$v`
{51Testing软件测试网lV d*J`
//定义string1指针,其指向一个堆上的100个字节的内存空间51Testing软件测试网y-B_C_f
o
char *string1 = (char*)malloc(100*sizeof(char));
(_-]:l+e(h0U0//定义string2指针,其指向一个堆上的200个字节的内存空间
:A$y }jwTlB0char *string2 = (char*)malloc(200*sizeof(char));51Testing软件测试网c/T.j
G2Z:ZH4t9o
scanf("%s", string2);51Testing软件测试网0Awm D
Zw5u})G
string1=string2;/*string1原先指向的100个字节的内存没有被释放*/
o.zMV
baM0/*而后又被指向string2所指的内存块,造成前面100个字节的内存泄漏*/51Testing软件测试网9ST5[/`3V,n
free(string2);51Testing软件测试网[b9Z7o h*pW
free(string1); /* 这个free()调用会失败,因为string1指向的内存地址与string2的相同,而那块内存已经被释放了 */
{/RK2Ch%I BD0return 0;51Testing软件测试网f5s`K3o
[f
}
2iXc8_ia0 解决:在程序堆上分配内存后,要在使用完后及时释放,同时避免野指针的产生,比如string1。
K6DZ0vh
w9z O0 原理:内存是软件运行的重要的空间资源,内存泄漏实际上是浪费了软件的空间资源。因此,内存泄漏对软件的性能影响十分重要。51Testing软件测试网`d-}X|r[
另外,对于程序在时间上的浪费,我们通常是采用优化算法和数据结构的解决策略。
6x}/XHR0 案例3
%O$W/?^x2z7U D0 最近几年,很多知名软件公司在招聘软件测试人员,考察代码能力的时候,内存泄露和算法优化是经常的试题之一。这说明了用户对软件性能的要求越来越严格,已经传递到了软件公司。
%F!y#gQyJjF#W(y0
ZjD(y _V051Testing软件测试网{0o9if n1f2.以空间换时间51Testing软件测试网P9O2Sy!x;c F g
软件的高性能并不是凭空产生的,在解决了空间和时间浪费的问题之后,如果用户还有更高的性能要求,我们软件人员只好“偷梁换柱”,做一下调整,而这种调整往往是很灵活的。
;B.`.N5^i_&ci0空间换时间是软件人员解决性能问题最常见的方法。是在系统功能正常的前提下增大软件空间开销的方法来缩减运行的时间。一般的方法有算法调整、并行计算方法、体系结构方法和一些不是“办法”的办法。
+Bco*w?V0 通常的解决方案有Cache缓存、数据库的index等。51Testing软件测试网:X5f6S8W9v g Q
案例451Testing软件测试网5]l'pO8Hy+B,d[|x/v
一个动态网站服务器总发生CPU耗尽的问题,因此造成给用户的响应缓慢或者长时间没有响应,进而引起Server的宕机。经调查分析,网站首页是个PHP程序,每次用户访问都要多次查询数据库,也没有Cache机制,数据库查询负荷过高,耗尽CPU。
h8I8Y|4L+_-St0 解决:改写网站首页以及部分频繁访问的程序,增加Cache机制,减少数据库访问。
#BtA.Tk0 原理:将常用数据放在服务器的内存中,虽然增加了内存的开销,但带来了时间上的优化,对用户而言,提高了处理速度。51Testing软件测试网}3Q-]/Bp~)S,Y#m
P]
51Testing软件测试网 Z?yX7D$G4K2j
(@t2yt*@3a8`03.以时间换空间51Testing软件测试网b5p+t`s?
ID2WtoA
时间换空间的方案解决性能问题的情形比较少。有时会出现在对内存要求十分苛刻的地方,比如嵌入式操作系统中。
$xT
I.i}'@5p1t2J0 案例551Testing软件测试网 hU%D%rg O+aj]!Z
程序设计的要求是不设中间变量,交换两个变量的值。51Testing软件测试网xl2IlB
@&c0]|
我们通常的中间变量的解决方案是:51Testing软件测试网u$B5O'cT
Void swapOne(int *a, int *b)
(IM,Hb$_n0{51Testing软件测试网9q.L@f$y3M6Bt'Grn
Int temp;51Testing软件测试网V2u6Sp)@ApJ f
Temp = *a;
)PE@ ^yB0HTxSXk0 *a = *b;51Testing软件测试网&g0B9V!pJ-c$zd
*b= temp;
,F)nV)WZ5J+~j;D0}51Testing软件测试网g^fcg
但这里需要在程序中为temp变量在栈上分配一个空间。可不可以不用这个temp变量呢?51Testing软件测试网{u)X^3C8a,F3^G
解决:
c
v*v:@9pl4YD!b0修改程序如下:51Testing软件测试网.\:n CNJ6wH#P
void swapTwo(int *a,int *b)51Testing软件测试网8Qo x+M"G5TRy
{
oA qad0*a=*a+*b;51Testing软件测试网Lim,\S;@H0]N(p2c
*b=*a-*b;
+WU#Wo5[:kEiVEg0*a=*a-*b;51Testing软件测试网,f,P6?2G!c G!_?q
}51Testing软件测试网)p*yk!N1m
原理:修改之后,多了运算复杂度,但没有使用第三方变量,减少了空间的占用。51Testing软件测试网d
H-{V'U6y&h2M
51Testing软件测试网X?u%Z[*e'cG
51Testing软件测试网(O"N:M+Fr)],^M 以上是我们从简单的程序例子来理解性能解决方案,但现实要远远复杂得多,因为随着软件系统功能的复杂强大,软件的规模也在不断扩大,我们不可能完全自己开发程序,很多时候是利用已有的平台和中间件资源。在这种场景下,我们应该怎样考虑性能问题呢?51Testing软件测试网;@Dg7C!~)o@eN
[
6RE/gR"g0 第一,软件系统设计的架构及技术平台51Testing软件测试网&n
g\F/ZKF)w
软件在设计阶段一旦决定采用哪种架构和技术,其性能也就注定只能在一定的范围内变动了。这就是“先天”因素。比如在上节讲到的一个删除/增加数据的业务操作,如果用户对时间非常苛刻,密集型计算、在线的大数据量统计和分析等应用,这些场景通常J2EE不能够很好地解决,使用C++或者其他平台搭建会更合理些。如果在这些场景下硬要采用J2EE架构,那么开发和设计人员如何绞尽脑汁,优化设计和程序,也不会满足用户的性能要求。
udn-~w7PL6I
P
i051Testing软件测试网 s&k,L0t \&}#_8\8c 第二,中间件的设置和优化
lU[A^Q0 这里的中间件是广义的中间件,是应用程序调用的第三方软件,包括操作系统、数据库、Web服务器、消息服务器等。我们不能改变中间件的程序,只能通过调优手段来提高它所支持的软件系统的性能。
?}m5|d8N,[0
[Tq7Qo1Q r0 第三,硬件的配置51Testing软件测试网hb8L
Qn
这里包括服务器硬件配置和网络环境。服务器硬件包括内存、CPU等,网络环境有交换机、路由器等。51Testing软件测试网?:`"ZC-x"["?
收藏
举报
TAG:
如何提高软件性能
软件性能测试
性能测试