质量属性-性能--修改

性能与时间有关。性能与事件发生时,将要耗费多长时间做出响应有关。
性能是指系统的响应能力----即对外部刺激出反应时所需要的时间或在某段时间内所处的事数。
性能的战术:
1.资源需求

  • 尽量减少对变量的重复计算

明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:

1 for (int i = 0; i < list.size(); i++)
2 {...}
3 建议替换为:
4 for (int i = 0, length = list.size(); i < length; i++)
5 {...}
View Code

这样,在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 }
View Code
  • 限制队列大小,控制处理事件的数量

针对这个问题,在之前的热词分析项目中,把首页直接表格显示所有数据库内容,改成了分页显示,并且跳页才查询,只查询当前页的记录

 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 }
并行流原理:分支/合并框架(ForkJoinPool)

 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
优先级策略

 

posted @ 2020-03-16 19:27  daisy99lijing  阅读(150)  评论(0编辑  收藏  举报