性能战术(2)
性能战术
性能性:性能是指系统的响应能力。性能与时间有关。事件(中断、消息、用户请求或时间已到)发生时,系统必须做出响应。事件到达和相应有很多特性,但性能基本上与事件发生时,将要耗费系统多长时间做出响应有关。
*时间、空间(如:内存)架构平衡时间空间
目标:对一定时间限制内到达系统的时间生成一个响应,这些事件可以是消息到达、定时器到时,系统状态的变化。
影响响应时间的两个因素:
1.资源消耗:资源包括CPU、数据存储、网络通信带宽和内存等;资源消耗是指实际需要耗费的时间;
资源消耗包括:每个事件都要经过一定的处理序列
2.闭锁时间:由于资源争用、资源不可用或长时间计算导致事件无法处理,这是指计算机可能等待的时间。
在性能方面,空间和时间是不可兼得的,要想得到快速响应,就一定要拿空间来换取,相反,想要减少空间的占用,那么运行时间一定会有所影响,一定不存在占用空间少的同时,运行速度又非常迅速的情况。
三个分类:
1.资源需求-分析影响性能的资源因素
事件流是需求的源;
需求两个特性:
1.资源流中事件之间的时间间隔
2.每个请求所消耗的资源
资源需求战术:
1.减少处理一个事件流所需要的资源。
1.提高计算效率
对算法进行优化,往往简单的算法更加高效,运行速度更快。
1 # 问题 2 # a + b + c = 1000 3 # a*a + b*b = c*c 4 # 求 a b c 5 6 ##########方法一 7 import time 8 9 # 方法一 10 start_time = time.time() 11 12 for a in range(0,1001): 13 for b in range(0, 1001): 14 for c in range(0, 1001): 15 if a+b+c ==1000 and a**2 +b**2 == c**2: 16 print('a, b, c: %d %d %d ' %(a,b,c)) 17 18 end_time = time.time() 19 20 print('method_1 cost time is : %d s'%(end_time-start_time)) 21 print('finished method 1 ') 22 23 #########方法二 24 # 方法二 25 start_time = time.time_ns() 26 for a in range (0,1001): 27 for b in range (0,1001): 28 if a**2 + b**2 ==(1000-a-b)**2: 29 print('a, b, c: %d %d %d ' % (a, b, 1000-a-b)) 30 31 end_time = time.time_ns() 32 33 print('method_2 cost time is : %d ns'%(end_time-start_time)) 34 print('finished method 2') 35 ###########方法三 36 # 方法三 37 start_time = time.time_ns() 38 c = [print(a,b,(1000-a-b )) for a in range(0,1001) for b in range(0,1001) if a**2+b**2 == (1000-a-b)**2 ] 39 end_time = time.time_ns() 40 print('method_3 cost time is : %d ns'%(end_time-start_time)) 41 print('finished method 3')
很明显,方法三的时间复杂度 T (n)= O(n^2),方法二和方法三 的时间复杂度是一样的,方法一时间复杂度为T(n)=O(N^3),方法二、三会比方法一快。
2.减少计算开销
保存每次运算结果,减少内存的占用
2.减少所处理事件的数量
a.在查询数据时,可以增加全文索引,提高查询速度。
b.应用中,进行数据查询,每次查询结果均可建立新表存储结果,下次再查询该关键词时,可直接从以该关键词命名的表直接查询,减少了需要处理数据的条数,同时维持查询数据的副本,同时也增加了可用资源。所要查询的数据减少,所消耗的资源肯定也减少了,需要时间也减少。
创建表
根据sql语句对查询进行结果表的创建,在后台将创建结果展示。
先判断要查询的关键词表是否存在,若存在则直接从该关键词基本表进行全部查询,若表不存在,则调用创建表函数createtable(keyword),建立相关关键词表。
同时,在数据库调用完成之后,要及时关闭数据库,减少资源占用。
1 /*** 2 * 创建表 3 * @throws SQLException 4 */ 5 6 public void createtable(String key) throws SQLException { 7 String sql = "create table "+key+" (select * from words where baike like '%"+key+"%')"; 8 Connection conn = DBUtil.getConnection(); 9 Statement stmt = null; 10 //执行创建表 11 System.out.println("//创建表"); 12 stmt = conn.createStatement(); 13 if(0 == stmt.executeLargeUpdate(sql)) { 14 System.out.println("成功创建表!"); 15 } 16 else { 17 System.out.println("创建表失败!"); 18 } 19 DBUtil.close(conn); 20 DBUtil.close(stmt); 21 }
3.控制资源的使用
1.限制执行时间
在执行操作时,可以对程序运行时间进行控制,当时间超过某一固定值时可以结束进程并提醒操作超时。
参考:https://blog.csdn.net/linayangoo/article/details/86352719
1 //遇到问执行耗时js 2 //精确控制执行时长 3 console.time("count1"); //计时开始 4 var start = new Date().getTime(); 5 do{ 6 var end = new Date().getTime(); 7 }while(end-start<=2000); 8 console.timeEnd("count1");//计时结束 9 postMessage("执行结束");//worker线程向UI发送数据
2.限制队列大小
对要查询的数据进行限制,数据展示页面,可以对数据进行不完全加载,通过翻页进行加载数据,可减少每次查询所需要的时间。
2.资源管理-提高资源的应用效率
1.引入并发
多线程,多线程编程的目的,就是"最大限度地利用CPU资源",通常多线程的应用不是为了提高运行效率,而是为了提高资源使用效率。比如你的应用程序需要访问网络,因为网络有延时,如果在界面线程访问,那么在网络访问期间界面将无法响应用户消息,这是就应该使用多线程。
多线程呢,大概就是一项工程由多人分工完成,而不是一人独自完成,这样的效率明显不同,运行速度更快。
多线程设计可以充分利用计算机资源,最大限度的提升软件性能。
但是多线程使用不当会适得而反,因为cpu在多线程之间的切换以及多线程之间的资源共享和线程同步需要法非较大的资源。
因此在单核cpu的前提下,多个线程的运行时间交叉越少越好,交叉的越少多线程的效率越高,效果就越明显,相反多线程运行时间交叉越多效果越低,在极端的情况下,甚至多线程的效果还不及单线程顺序执行的效果好。
现在电脑的配置越来越高,cpu都是多核的,多线程的效率比以前提高很多,使用的限制也越来越小,多核cpu使得同一时刻也可以使用多线程进行交叉处理,实现多线程的真正并发,真正提高处理效率。
参考博客:https://blog.csdn.net/ll641058431/article/details/80641285
2.维持数据或计算的多个副本
同对查询结果建立缓存,或者利用cookie进行本地数据缓存,每次进行计算获取数值比调用已存在数据会慢很多,所以维持数据是很有必要的。对于缓存的方法有很多,websql,indexDB等。
参考: https://blog.csdn.net/michael_xwb/article/details/90083357
https://www.cnblogs.com/happylittlefish/p/10470048.html
3.增加可用资源
可以增加内存、CPU等。
3.资源仲裁-解决资源的争用
1.先进先出
当用户和浏览器交互时,操作系统首先要判断是计算机中的哪个设备在输入,然后判断哪个应用应该接收这些输入之后,将它们打包为单独事件并放置到该应用的事件队列中。浏览器按照队列顺序完成其队列中单独事件的处理。它按先进先出的顺序把它们从队列中取出来,然后决定如何处理这个事件。通常,浏览器将基于这些事件做如下的操作:对事件本身做处理(例如:浏览网页、显示设定动画)或执行页面本身的JS。浏览器使用单线程在队列中取出事件,然后对事件本身进行处理或执行JS,所以浏览器一次只能处理一个任务,并且任何一个任务都能阻止其它任务的执行。
参考:https://www.cnblogs.com/fuyali/p/4270141.html
2.固定优先级
对事件优先级进行确定,当该事件发出请求时,系统按照优先级顺序进行响应,对于资源调用来说,优先级越靠前,对资源的调用越便捷。类似于开了VIP一样,你有了vip,你的操作就会按照优先级进行响应,相比普通用户,vip用户对资源的利用时间会快。
3.动态优先级:轮转,时限时间最早优先
动态优先数是指在进程创建时先确定一个初始优先数, 以后在进程运行中随着进程特性的改变不断修改优先数,这样,由于开始优先数很低而得不到CPU的进程,就能因为等待时间的增长而优先数变为最高而得到CPU运行。
4.静态调用
应该就是在代码的时候就已经确定好的吧,直接调用就行。