程序性能调优技巧(数据优化和算法优化,ByChinasei).pdf
上传人:sy****28 上传时间:2024-09-14 格式:PDF 页数:10 大小:298KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

程序性能调优技巧(数据优化和算法优化,ByChinasei).pdf

程序性能调优技巧(数据优化和算法优化,ByChinasei).pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

ChinaSEI系列讲义(By郭克华)程序性能调优技巧(上,Chinasei)如果有文字等小错,请多包涵。在不盈利的情况下,欢迎免费传播。版权所有.郭克华本讲义经过修正、扩充,由清华大学出版社出版。详细可查询http://www.china-pub.com/51834http://product.dangdang.com/product.aspx?product_id=208624691数据优化1.1优化变量赋值一般说来,由于局部变量用完之后释放,因此有些作用范围较大的变量操作,改为局部变量来实现,有助于节省宝贵的系统资源。如下代码:classTest{intsum;voidcal(){for(inti=1;i<1000;i++){sum+=i;}}}该代码是求1到1000的和,变量sum作为类成员变量,在循环中对其进行反复读取,由于对局部变量进行读取,消耗资源较少,因此,我们可以将这个读取过程交给局部变量去做,代码如下:classTest{intsum;voidcal(){inttemp=sum;for(inti=1;i<1000;i++){temp+=i;}sum=temp;}}该代码中,对sum的读取和赋值变为了对局部变量temp的访问。#提示后面的代码在可读性上不如前面的代码,所以在采用时应该权衡考虑。1.2优化字符串由于字符串的特殊性和灵活性,字符串的优化应用较广。首先,由于字符串的池机制,字符串的初始化(分配内存过程)就可以优化。看如下代码:Stringstr=newString("China");该代码中,系统实例化一个新的对象str,为其分配内存空间。但是由于字符串使用了池机制,可以将上面的代码优化如下:Stringstr="China";此代码中,系统首先检查池中有无“China”,如果有,系统将直接使用池中的字符串,而不用新分配内存空间。#提示字符串的池机制是指:当字符串初始化时,首先在池(内存的一片空间)中查找,是否存在该字符串,如池中有该字符串,就使用池中的;如果没有,系统为字符串分配新的空间,并放入池中。一般情况下,由于字符串常量的出现都会附带为其分配内存空间,因此,能够避免字符串常量出现的场合,可以尽量避免。如下代码:Strings;if(s.equals("")){//一些操作}该代码将字符串s和空字符串相比较,虽然空字符串中没有内容,但是也要占用字符串所规定的内存空间。因此,我们可以用如下代码加以避免:Strings;if(s.length()==0){//一些操作}又如,如下代码:StringBuffersb;Stringstr=",";for(inti=0;i<10;++i){sb.append(i);sb.append(str);}该代码中,字符串str中只包含一个逗号,如果用字符串的形式来保存,比用字符形式保存消耗的资源要多。因此,该代码可以作如下优化:StringBuffersb;for(inti=0;i<10;++i){sb.append(i);sb.append(',');}将逗号用字符来表示,节省系统资源。值得一提的是,在对多个字符串进行操作或对一个字符串进行修改时,用StringBuffer比用String要好。如下代码:Stringstr1="s1";Stringstr2="s2";Stringstr3=str1+str2;str3将保存str1和str2连接在一起的结果,系统将为str3额外分配内存。为了避免这个额外的资源消耗,代码可以优化如下:StringBuffersb=newStringBuffer("s1");Stringstr2="s2";sb.append(str2);这样,就不需要为两个字符串连接的结果额外分配内存。当然,此时带来的代价是:前面那个字符串的内容丢失了。1.3选择合适的数据结构在实际开发的过程中,选择一种合适的数据结构很重要。比如:有一堆随机存放的数据,如果经常在其中进行插入和删除操作,那使用链表较好;如果要经常进行读取,并且数据个数固定,则使用数组较好。这里需要注意的是,在高级语言中,大部分语言中虽然提供了同样功能的API,但是底层实现机制不同,操作性能大不相同,而不是从表面就可以看出来的。如Java语言中:9ArrayList和LinkedList,提供了功能类似的API,如对元素的增删改查。但是前者采用数组方式存储数据,后者采用链表方式存储数据