性能战术在代码中的体现
性能战术目标和基本的方法如下图
总结来说性能最重要的就是时间和空间的合理划分。响应时间越短对于空间的要求往往也会非常高,不能顾此失彼,一个高性能的系统应该是两者都能兼顾到。
资源需求:
1.减少一个事件流所用的资源
1.1:尽量避免随意使用静态变量。多使用局部变量
1.2:尽量使用基本数据类型代替对象。基本类型数据产生和处理都在栈中处理,对象是在堆中产生实例。
String str=“hello”;
String str =new String("hello");
1.3:使用移位代替乘除运算,左乘右除.<<,>>
1.4:尽量避免使用二维数组
1.5:频繁调用结构简单的函数设置为内联函数
2.减少处理事件的数量。
控制采样频率。
3.控制资源的使用
超时任务的返回设定,
应用:病毒动态演示时当某一天异常超时时,跳过渲染下一天地图
jdk1.5自带的并发库中Future类。
Future类中重要方法包括get()和cancel()。get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。
public static void main(String[] args) throws InterruptedException, ExecutionException { final ExecutorService exec = Executors.newFixedThreadPool(1); Callable<String> call = new Callable<String>() { public String call() throws Exception { String date=["2020-01-27","2020-01-28","2020-01-29","2020-01-30","2020-01-31","2020-02-01","2020-02-02","2020-02-03","2020-02-04","2020-02-05","2020-02-06","2020-02-07","2020-02-08","2020-02-09","2020-02-10","2020-02-11","2020-02-12","2020-02-13","2020-02-14","2020-02-15"];
for(int i=0;i<date.length;i++){
String data=ShowByDate(date[i]);、、传递日期
SetMap(data)//渲染地图
sleep(1000); Thread.sleep(1000 * 5); return "线程执行完成."; } }; try { Future<String> future = exec.submit(call); String obj = future.get(1000 * 1, TimeUnit.MILLISECONDS); //任务处理超时时间设为 1 秒 System.out.println("任务成功返回:" + obj); } catch (TimeoutException ex) { System.out.println("处理超时啦...."); ex.printStackTrace(); } catch (Exception e) { System.out.println("处理失败."); e.printStackTrace(); } // 关闭线程池 exec.shutdown(); }
资源管理
1.引入并发
(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
应用:热词分析项目中需要读取两个表格形成最后的查询界面,可以开启多线程同时查询
public class TestThread extends Thread{ public void run() { List<WordBean> list=new ArrayList<WordBean>(); String sql="select * from desc_likecount limit 100"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; WordBean bean=null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String url=rs.getString("lemmaUrl"); bean=new WordBean(Url); list.add(bean); //查询百度连接表 } }catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } } public List<DataBean> getAllWordData() { Thread mThread = new TestThread(); mThread.start();//启动线程 List<DataBean> list=new ArrayList<DataBean>(); String sql="select * from data limit 100"; Connection conn = DBUtil.getConn(); Statement state = null; ResultSet rs = null; DataBean bean=null; try { state = conn.createStatement(); rs = state.executeQuery(sql); while (rs.next()) { String id=rs.getString("lemmaid"); String title=rs.getString("lemmaTitle"); String synopsis=rs.getString("synopsis"); int share=rs.getInt("shareCount"); int like=rs.getInt("likeCount"); bean=new DataBean(id,title,synopsis,url,share,like); list.add(bean);//查询主表 } }catch (SQLException e) { e.printStackTrace(); } finally { DBUtil.close(rs, state, conn); } return list; } } }
2.维持数据或计算的多个副本。比如说保存相同运算的结果
3.增加可用资源。增加内存,CPU速度。
可以在相关的配置文件中进行修改调整内存大小。
Xms = 设置内存初始化的大小
Xmx = 设置最大能够使用内存的大小
资源仲裁:
1.先进先出(队列)
应用场景:购票排队
队列是一个满足如下条件的数据结构:
(1)数据项一个挨着一个呈线性;
(2)所有的插入操作在一端进行(对头);
(3)所有删除操作在另一端进行(对尾);
(4)最先插入的记录是第一个被删除的记录;
2.为事件设立优先级(优先级队列)
动态设立优先级
轮转,实现时间最早优先
public class MyThread1 extends Thread{ MyThread1(String name){ super(name); } @Override public void run() { for(int i = 0; i < 10000 ; i++){ System.out.println(getName()+": "+i); } } } public class MyThread2 extends Thread{ MyThread2(String name){ super(name); } @Override public void run() { for(int i = 0; i < 10000 ; i++){ System.out.println(getName()+": "+i); } } } public class Test { public static void main(String[] args) { MyThread1 t1 = new MyThread1("t1"); MyThread1 t2 = new MyThread1("t2"); t1.setPriority(Thread.NORM_PRIORITY + 3); t1.start(); t2.start(); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步