性能战术在代码中的体现

性能战术目标和基本的方法如下图

 

总结来说性能最重要的就是时间和空间的合理划分。响应时间越短对于空间的要求往往也会非常高,不能顾此失彼,一个高性能的系统应该是两者都能兼顾到。

 

 资源需求:

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();
    }
}

 

posted @ 2020-03-02 17:24  Evak  阅读(201)  评论(0编辑  收藏  举报