Lab 3代码评审与程序性能优化.docx
- 文档编号:6121529
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:23
- 大小:562.76KB
Lab 3代码评审与程序性能优化.docx
《Lab 3代码评审与程序性能优化.docx》由会员分享,可在线阅读,更多相关《Lab 3代码评审与程序性能优化.docx(23页珍藏版)》请在冰豆网上搜索。
Lab3代码评审与程序性能优化
哈尔滨工业大学计算机科学与技术学院
2014年秋季学期《软件工程》
Lab3:
代码评审与程序性能优化
目录
1实验要求1
2在Eclipse中配置代码审查与分析工具1
2.1Checkstyle1
2.2PMD2
2.3FindBugs3
2.4TPTP4
3本次实验所评审的代码4
4Checkstyle所发现的代码问题清单及原因分析11
5PMD所发现的代码问题清单及原因分析12
5.1CPD问题12
5.2代码规范问题12
6FindBugs所发现的代码问题清单及原因分析14
7TPTP性能分析结果14
7.1执行时间的统计结果与原因分析14
7.2内存占用的统计结果与原因分析14
7.3代码改进之后的执行时间统计结果15
7.4代码改进之后的内存占用统计结果16
8评述17
8.1对代码规范方面的评述17
8.2对代码性能方面的评述17
9计划与实际进度17
10小结17
1实验要求
针对Lab1所完成的代码,进行代码评审(走查)和性能分析,从时间性
能角度对代码进行优化;
1练习代码评审的两个方面:
静态分析、动态分析(profiling);
2使用以下四个工具完成实验:
–Checkstyle
–FindBugs
–PMD
–TPTP
3按Lab1的分组方式,两人一组,随机分配另一组的代码作为本组评审
和分析的对象,实验期间不能与原作者进行沟通。
2在Eclipse中配置代码审查与分析工具
采用屏幕截图的方式给出你自己在Eclipse中配置Checkstyle、PMD、Findbugs和TPTP
的过程。
2.1Checkstyle
2.2PMD
2.3FindBugs
2.4TPTP
3本次实验所评审的代码
尹首智_1120310203
packagetest;
importjava.util.*;
importjava.io.*;
importjava.math.*;
publicclasstest{
Stringgra=newString();
booleana[][]=newboolean[4][26];
doubleq[][]=newdouble[26][555];
doublecost[][]=newdouble[26][555];
doublereq_q[]=newdouble[4];
doublereq_c[]=newdouble[4];
doubleans_Q[]=newdouble[4];
doubleans_r[]=newdouble[4];
doubleans_c[]=newdouble[4];
intserv[]=newint[26];
intsev[][]=newint[4][26];
Scannercin;
//把文本处理为可用数组,并处理异常输入
publicvoidreadData()throwsIOException{
//第一个文件处理
cin=newScanner(newFile("./PROCESS.txt"));
intcnt=0;
while(cin.hasNextLine()){
Stringtmp=cin.nextLine();
for(intj=0;j charchar_now=tmp.charAt(j); if(char_now>='A'&&char_now<='Z') a[cnt][char_now-'A']=true; } cnt++; } doublemaxq[]=newdouble[55]; intmaxq_num[]=newint[55]; //读第二个文件 cin=newScanner(newFile("./SERVICE.txt")); while(cin.hasNext()){ Stringtmp=cin.next(); intact_num=tmp.charAt(0)-'A'; tmp=tmp.substring (2); intidx=Integer.parseInt(tmp); cin.nextDouble(); q[act_num][idx-1]=cin.nextDouble(); cin.nextDouble(); cost[act_num][idx-1]=cin.nextDouble(); if(maxq[act_num] maxq_num[act_num]=idx; maxq[act_num]=q[act_num][idx-1]-cost[act_num][idx-1]/100.0; } } for(inti=0;i<14;i++){ chartest_ch=(char)('A'+i); System.out.println(test_ch+""+maxq_num[i]); } //第三个文件 cin=newScanner(newFile("./REQ.txt")); cnt=0; while(cin.hasNext()){ Stringtmp=cin.next(); req_q[cnt]=Double.parseDouble(tmp.substring(tmp.indexOf('(')+1,tmp.indexOf(','))); req_c[cnt]=Double.parseDouble(tmp.substring(tmp.indexOf(',')+1,tmp.indexOf(')'))); cnt++; } } //算法函数 doubleqal[]=newdouble[4]; doubleqq[][]=newdouble[26][11]; intmin_cost_idx[][]=newint[26][11]; voidsolve()throwsFileNotFoundException{ FileOutputStreambos=newFileOutputStream("./RESULT.txt"); //PrintStreamx=System.out; System.setOut(newPrintStream(bos)); for(intnum=0;num<4;num++){ for(inti=0;i<26;i++){ for(intj=0;j<11;j++){ qq[i][j]=111; } } longsss=System.nanoTime(); intii=0; for(inti=0;i<26;i++){ if(! a[num][i]) continue; for(intj=0;j<500;j++){ intomg_idx=0; if(q[i][j]==0.90){ omg_idx=0; }elseif(q[i][j]==0.91){ omg_idx=1; }elseif(q[i][j]==0.92){ omg_idx=2; }elseif(q[i][j]==0.93){ omg_idx=3; }elseif(q[i][j]==0.94){ omg_idx=4; }elseif(q[i][j]==0.95){ omg_idx=5; }elseif(q[i][j]==0.96){ omg_idx=6; }elseif(q[i][j]==0.97){ omg_idx=7; }elseif(q[i][j]==0.98){ omg_idx=8; }elseif(q[i][j]==0.99){ omg_idx=9; }elseif(q[i][j]==1.00){ omg_idx=10; } if(qq[ii][omg_idx]>cost[i][j]){ qq[ii][omg_idx]=cost[i][j]; min_cost_idx[ii][omg_idx]=j; } } ii++; } doubledp[][]=newdouble[15][144444]; dp[0][0]=1; intopt_idx[][]=newint[14][144444]; intreq_cost_int=(int)req_c[num]*100; for(inti=0;i for(intnn=0;nn<11;nn++){ doubletmp_qal=nn/100.0+0.90; inttmp_cost_int=(int)(qq[i][nn]*100); if(qq[i][nn]>108) continue; for(intj=req_cost_int;j>=tmp_cost_int;j--){ if(dp[i+1][j] dp[i+1][j]=dp[i][j-tmp_cost_int]*tmp_qal; opt_idx[i][j]=nn; } } } } intopt_cost=-1; for(inti=1;i<=req_cost_int;i++){ if(ans_Q[num] ans_c[num]=opt_cost=i; ans_Q[num]=dp[ii][i]-((double)i)/10000.0; //System.out.println(ans_Q[num]); ans_r[num]=dp[ii][i]; } } /* for(inti=0;i<14;i++){ for(intj=0;j<144444;j++){ if(opt_idx[i][j]! =0&&num==0) System.out.println("aaaa"); } }*/ //System.out.println(""+ans_Q[num]); rev(opt_cost,ii,opt_idx); ii=0; for(inti=0;i<26;i++){ if(! a[num][i])continue; sev[num][i]=serv[ii];//还原编号,让字母对应它的服务项。 ii++; } longeee=System.nanoTime(); System.out.println("start: "+(sss/1000000)+"msend: "+(eee/1000000)+"mscost: "+((eee-sss)/1000000)+"ms"); } } voidrev(intres_cost,intlv,intopt_idx[][]){ if(lv==0) return; intomg=opt_idx[lv-1][res_cost]; intco=(int)(qq[lv-1][omg]*100); //System.out.println(lv+""+(1+min_cost_idx[lv-1][omg])+""+(omg/100.0+0.90)+""+co); serv[lv-1]=1+min_cost_idx[lv-1][omg]; rev(res_cost-co,lv-1,opt_idx); return; } voidrecordAns()throwsIOException{ Scannercin=newScanner(newFile("./PROCESS.txt")); for(intnum=0;num<4;num++){ Stringtmp=cin.nextLine(); for(inti=0;i charchar_now=tmp.charAt(i); System.out.print(char_now); if(char_now>='A'&&char_now<='Z') System.out.print("-"+sev[num][char_now-'A']); } System.out.println("\n"+"Reliability="+ans_r[num] +",Cost="+ans_c[num]+",Q="+ans_Q[num]+"\n"); } //System.setOut(x); return; } //主方法 publicstaticvoidmain(String[]args)throwsIOException{ //计时1 longsttt=System.nanoTime(); testsolution=newtest(); solution.readData(); //计时2 longstt=System.nanoTime(); solution.solve(); solution.recordAns(); //计时3 longedt=System.nanoTime(); //总时间 System.out.println("Executiontime: "+(edt-sttt)/1000000+"ms"); //算法时间(java的数据读入时间太坑了。 ) System.out.println("Algorithmexecutiontime: ="+(edt-stt)/1000000+"ms\n"); } } 4Checkstyle所发现的代码问题清单及原因分析 针对同种类型的问题,只需要列出一个典型代表即可。 编号 问题描述 类型 所在代码行号 修改策略 1 'if'结构必须要用大括号'{}'s. 209 加括号 2 数组中括号位置不对, 120 改为String[]args 3 名称'ans_r'必须符合正则表达式 15 替换 4 Javadoccommentmisssing 245 添加javadoc 5 0.90'是一个魔法数(即常数). 141 宏定义替换 6 Whitespace 7 Ctrl+shift+F 7 Resourceleak: 'cin'isneverclosed 225 Cin.close() 8 Theimportjava.mathisneverused 5 删除包java.math 9 行数超过40 86 缩减空格,合并行 10 Expected@paramtagfor'optidx'. 161 添加入口参数注释 11 TheString"E: \\PROCESS.txt"appears2timesinthefile. 36 12 =号后面需要一个空格 79 加一个空格 5PMD所发现的代码问题清单及原因分析 5.1CPD问题 可疑的Cut&Paste代码段 5.2代码规范问题 优先级 问题描述 违反的规则集 所在代码行号 修改策略 high 变量命名约定: 变量命名规则-根据你的喜好调整。 当前规则检查final类型变量应该全部大写而且非final变量应该不包含下划线。 VariableNamingConventions 226 去掉下划线 Mediun-high ReferencestoSystem.(out|err).printareusuallyintendedfordebuggingpurposesandcanremainin thecodebaseeveninproductioncode.Byusingaloggeronecanenable/disablethisbehaviourat will(andbypriority)andavoidcloggingtheStandardoutlog. SystemPrintln 233 Mediun-high AvoidinstantiatingStringobjects;thisisusuallyunnecessarysincetheyareimmutableandcanbesafelyshared. StringInstantiation 14 medium Denoteswhethercommentsarerequired(orunwanted)forspecificlanguageelements. CommentRequired 75 low Alocalvariableassignedonlyoncecanbedeclaredfinal. LocalVariableCouldBeFinal 52 low Thedataflowanalysistrackslocaldefinitions,undefinitionsandreferencestovariablesondifferentpathsonthedataflow. DataflowAnomalyAnalysis''). 132 6FindBugs所发现的代码问题清单及原因分析 问题描述 类型 所在代码行号 修改策略 无 7TPTP性能分析结果 7.1执行时间的统计结果与原因分析 给出图示 分析某些函数被调用次数和执行时间较高的原因 : 得循环执行该函数知道找到结果 阐述如何改进 : 可以不用改进,代码性能很好了 7.2内存占用的统计结果与原因分析 给出图示 分析某些函数所需内存较高的原因 : 用的数组比较多,而且数组较大 阐述如何改进 : 有些函数中的数组可以直接用主程序的数组,不用新开一个数组空间 7.3代码改进之后的执行时间统计结果 改进代码之后,重新运行TPTP获取结果,给出图示 分析改进的幅度、是否还可能继续改进 : 很难改进 7.4代码改进之后的内存占用统计结果 改进代码之后,重新运行TPTP获取结果,给出图示 分析改进的幅度、是否还可能继续改进 : 很难改进 8评述 8.1对代码规范方面的评述 对你们组所拿到的其他同学的程序在遵循代码风格规范方面的水平做一个简要的评论。 若代码风格较好,给你们本次实验的工作带来哪些方面的好处? 若代码风格较差,给你们本次实验的工作带来哪些方面的坏处? 该组基本没有遵循代码风格规范,写的非常随意,就像刚刚写的草稿一样。 各个方面都不是很规范,变量也是随意建的,遇见需要变量的地方就添加一个变量。 所以这给我们带来了很大的麻烦,就checkstyle而言,就有669个错误需要改动,所以改动很是麻烦。 如果代码风格较好的话,实验中我们就可以省下很多时间来改动本来可以避免的错误。 8.2对代码性能方面的评述 对你们组所拿到的其他同学的程序在遵循代码风格规范方面的水平做一个简要的评论。 该同学的代码性能还是比较好的,跑出结果所用的时间比较理想,占用内存空间也比较小。 所以整体质量比较高。 就是前面讲的代码风格规范那里有问题。 9计划与实际进度 任务名称 计划时间长度(分钟) 实际耗费时间(分钟) 提前或延期的原因分析 Checkstyle 30 60 代码很不规范,错误特别多 Pmd 60 60 经过checkstyle检查一下,错误在这个部分比较少 Findbugs 30 30 错误基本没有 tptp 60 60 代码性能比较高 10小结 回答几个问题: ●使用这些工具,会对编程效率和代码质量有什么提升? ●FindBugs、PMD、CheckStyles三者都是代码规范静态检查工具,它们之间有何异同? 从分析结果看,它们有什么优劣? ●从配置/使用的简便性、代码规范的可扩展性/可自定义性等角度对FindBugs、PMD、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Lab 3代码评审与程序性能优化 代码 评审 程序 性能 优化