质量属性-性能--修改
性能与时间有关。性能与事件发生时,将要耗费多长时间做出响应有关。
性能是指系统的响应能力----即对外部刺激出反应时所需要的时间或在某段时间内所处的事数。
性能的战术:
1.资源需求
- 尽量减少对变量的重复计算
明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:
1 for (int i = 0; i < list.size(); i++) 2 {...} 3 建议替换为: 4 for (int i = 0, length = list.size(); i < length; i++) 5 {...}
这样,在list.size()很大的时候,就减少了很多的消耗
- 尽量采用懒加载的策略,即在需要的时候才创建例如:
1 String str = "aaa"; 2 if (i == 1) 3 { 4 list.add(str); 5 } 6 建议替换为: 7 if (i == 1) 8 { 9 String str = "aaa"; 10 list.add(str); 11 }
- 限制队列大小,控制处理事件的数量
针对这个问题,在之前的热词分析项目中,把首页直接表格显示所有数据库内容,改成了分页显示,并且跳页才查询,只查询当前页的记录
1 <table border="1" cellpadding="3" cellspacing="0" style="width: 80%;margin:auto"> 2 <tr> 3 <td style="width:40px">序号</td> 4 <td style="width:40px">热词</td> 5 <td>热词解释</td> 6 <td>内容链接</td> 7 </tr> 8 <% List<WordBean> list = dao.select_page(pages,limit); 9 //List<WordBean> list =(List<WordBean>)session.getAttribute("list"); 10 for(WordBean n:list){ %> 11 <tr> 12 <td><%=n.getId() %></td> 13 <td><%=n.getWord() %></td> 14 <td><%=n.getExplain() %></td> 15 <td><a href='<%=n.getLink() %>'><%=n.getLink() %></a></td> 16 </tr> 17 <%} %> 18 </table>
1<%@pagelanguage="java"contentType="text/html;charset=UTF-8"2pageEncoding="UTF-8"%>3<%@pageimport="com.bean.WordBean"%>4<%@pageimport="com.dao.WordDao"%>5<%@pageimport="java.util.List"%>6<%@pageimport="java.util.ArrayList"%>7<%8WordDaodao=newWordDao();9intpages=0;//待显示页面10intcount=0;//总条数11inttotalpages=0;//总页数12intlimit=10;//每页显示记录条数13count=dao.select_count();1415//由记录总数除以每页记录数得出总页数16totalpages=(int)Math.ceil(count/(limit*1.0));17//获取跳页时传进来的当前页面参数18StringstrPage=request.getParameter("pages");19//判断当前页面参数的合法性并处理非法页号(为空则显示第一页,小于0则显示第一页,大于总页数则显示最后一页)20if(strPage==null){21pages=1;22}else{23try{24pages=java.lang.Integer.parseInt(strPage);25}catch(Exceptione){26pages=1;27}2829if(pages<1){30pages=1;31}3233if(pages>totalpages){34pages=totalpages;35}36}37%>38<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">39<html>40<head>41<styletype="text/css">42body{43background:#ffffff;44font-family:华文行楷;45}46tr:nth-child(2n)47{48background:#f5fafc;49}50</style>51<metacharset="UTF-8">52</head>53<bodystyle="height:100%;margin:0;">54<divstyle="text-align:center"class="results">55<tableborder="1"cellpadding="3"cellspacing="0"style="width:80%;margin:auto">56<tr>57<tdstyle="width:40px">序号</td>58<tdstyle="width:40px">热词</td>59<td>热词解释</td>60<td>内容链接</td>61</tr>62<%List<WordBean>list=dao.select_page(pages,limit);63//List<WordBean>list=(List<WordBean>)session.getAttribute("list");64for(WordBeann:list){%>65<tr>66<td><%=n.getId()%></td>67<td><%=n.getWord()%></td>68<td><%=n.getExplain()%></td>69<td><ahref='<%=n.getLink()%>'><%=n.getLink()%></a></td>70</tr>71<%}%>72</table>73<formname="f1"method="POST"action="select.jsp"onSubmit="returnchecknum()">74<tableborder="0"align="center">75<tr>76<td>第<%=pages%>页共<%=totalpages%>页<ahref="select.jsp?pages=1">首页</a></td>77<td><ahref="select.jsp?pages=<%=(pages<1)?pages:(pages-1)%>">上一页</a></td>78<td><ahref="select.jsp?pages=<%=(pages>=totalpages)?totalpages:(pages+1)%>">下一页</a></td>79<td><ahref="select.jsp?pages=<%=totalpages%>">最后一页</a></td>80<td>转到第:<inputtype="text"name="page"size="8">页<inputtype="submit"value="GO"name="cndok"></td>81</tr>82</table>83</form>84</div>85</body>86</html>8788现代码
2.资源管理
1 public class ForkJoinSumCalculator extends java.util.concurrent.RecursiveTask<Long> { 2 3 private final long[] numbers; 4 private final int start; 5 private final int end; 6 public static final long THRESHOLD = 10_000; 7 public ForkJoinSumCalculator(long[] numbers) { 8 this(numbers, 0, numbers.length); 9 } 10 private ForkJoinSumCalculator(long[] numbers, int start, int end) { 11 this.numbers = numbers; 12 this.start = start; 13 this.end = end; 14 } 15 @Override 16 protected Long compute() { 17 int length = end - start; 18 // 超过阈值则顺序流执行:分解任务到可顺序流执行的大小 19 if (length <= THRESHOLD) { 20 return computeSequentially(); 21 } 22 // 切割一半任务到leftTask 23 ForkJoinSumCalculator leftTask = 24 new ForkJoinSumCalculator(numbers, start, start + length/2); 25 leftTask.fork(); 26 ForkJoinSumCalculator rightTask = 27 new ForkJoinSumCalculator(numbers, start + length/2, end); 28 Long rightResult = rightTask.compute(); 29 // 加入 30 Long leftResult = leftTask.join(); 31 return leftResult + rightResult; 32 } 33 34 private long computeSequentially() { 35 long sum = 0; 36 for (int i = start; i < end; i++) { 37 sum += numbers[i]; 38 } 39 return sum; 40 } 41 42 public static long forkJoinSum(long n) { 43 long[] numbers = LongStream.rangeClosed(1, n).toArray(); 44 ForkJoinTask<Long> task = new ForkJoinSumCalculator(numbers); 45 return new ForkJoinPool().invoke(task); 46 } 47 }
3.资源仲裁
- 先进先出,同等看待每个资源
- 固定优先级,事先为某个事件分配优先级
- 动态优先级,运行时分配优先级
- 静态调度,非运行时确定资源的分配顺序
1importjava.io.InputStream;2importjava.util.ArrayList;3importjava.util.Scanner;45publicclassReadCommand{6publicstaticintcommand=0;//1-继续执行2-阻塞3-唤醒publicstaticvoidgetCommand(){print();InputStreamis=7//System.in;/*输入流*/Scannerscan=newScanner(is);/*从控制台输入*/intcount=1;8//booleantaget=false;while(true){if(Test.count==3){return;}9//ArrayList<String>commands=newArrayList<String>();commands.add("1");10//commands.add("2");commands.add("3");StringcomString="";while11//(!commands.contains(comString=scan.next()))/*判断是否有数据*/1213{System.out.println("请输入整数1、2、3");}command=Integer.parseInt(comString);if(command==1)14{15intsize=Test.list.size();16CommProcessrunCommProcess=Test.map.get(Test.list.get(size-count));17while(runCommProcess.getNeedtime()==0||runCommProcess.getState()=='W'18||runCommProcess.getState()=='F'){19count++;20inttemp=size-count;21if(temp<0){22System.out.println("没有可选的线程");23taget=true;24count=1;25break;26}27runCommProcess=Test.map.get(Test.list.get(temp));28}29if(taget){30taget=false;31continue;32}33runCommProcess.run();34if(runCommProcess.getNeedtime()<=0){35count++;36}37print();38if(count>size){39count=1;40}41}if(command==2)42{43count=1;44intsize=Test.list.size();45for(inti=0;i<size;i++){46CommProcesstemp=Test.map.get(Test.list.get(i));47if(temp.getNeedtime()>0&&temp.getState()=='E'){48temp.setState('W');49}50}51print();52}if(command==3)53{54booleantarget=false;55intsize=Test.list.size();56for(inti=0;i<size;i++){57CommProcesstemp=Test.map.get(Test.list.get(i));58if(temp.getState()=='W'){59target=true;60break;61}62}63if(target){//权重重新选择count=1;booleanfalg=true;for(inti=Test.list.size()-1;i64//>=0;i--){CommProcesstemp=Test.map.get(Test.list.get(i));if65//(temp.getState()=='E'){temp.setState('R');}elseif(temp.getNeedtime()66//>0&&temp.getState()=='W'){//不能直接设置,需要比较权重if(falg){falg=false;67//temp.setState('E');68}else{69temp.setState('R');70}71}72}73}74print();75}76}77}7879