1.下載地址:http://www.ej-technologies.com/download/jprofiler/filesjava
2.使用過程app
1.點擊此圖的new Session函數
2.點擊左邊application settings,右邊要點擊優化
3.點擊的Source Path ,點擊+號的圖標,點擊add directoryspa
4.點擊你工程的文件到binblog
5.左邊是程序尚未運行的,右邊是查詢運行的get
6.點擊你的項目雙擊倆下,或者點open,以後點擊OK就行了it
7.點擊CPU view,點擊Call Tree,以後點擊界面的一個按鈕io
8.這是一張CUP的圖,圖中顯示個個方法的使用佔的CPUclass
9.從中發現最大塊的函數對其進行分解優化,以及減小代碼塊的重複率。
下面舉個例子:查重模塊中調用到了diaoyong的方法,diaoyong方法調用到addcopy的方法,這樣就把200行左右的代碼分紅了7個方法,每一個方法的代碼很少於50行。
1.最大函數塊
import java.util.ArrayList; import java.util.List; /** * 查重的總函數 * @author admin * */ public class CongFu2 { /** * 查重 */ public boolean chacong(List<String> timus,String yunsuan){ boolean flat=false;//獲取是否重複的標記 boolean zhuzhifu=false;//在flat爲true的時候,終止本次循環的標誌 for(String s:timus){ if(!zhuzhifu){ List<String> str1=new ArrayList<String>();//獲取已經存入在list中的題目 List<String> str2=new ArrayList<String>();//獲取此次嘗試的題目 for(int i=0;i<s.length();i++){ str1.add(s.charAt(i)+""); str2.add(yunsuan.charAt(i)+""); } flat=false; for(int i=0;i<str1.size();i++){ if(!str1.contains(str2.get(i)) ||!str2.contains(str1.get(i))){ break; }else{ if(i==str1.size()-1){ flat=true; } } } if(flat){ flat=false; switch (str2.get(1)) { case "+": flat=false; switch (str2.get(3)) { case "+": flat=true; break; case "-": if(str2.get(4).equals(str1.get(4)) &&str2.get(3).equals(str1.get(3)) ||str2.get(3).equals(str1.get(1)) &&str2.get(4).equals(str1.get(2))){ flat=true; } break; case "/": if(str2.get(2).equals(str1.get(2)) &&str2.get(3).equals(str1.get(3)) &&str2.get(4).equals(str1.get(4)) ||str2.get(2).equals(str1.get(0)) &&str2.get(3).equals(str1.get(1)) &&str2.get(4).equals(str1.get(2))){ flat=true; } break; default: if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) ||str2.get(0).equals(str1.get(4)) &&str2.get(1).equals(str1.get(3))){ flat=true; } break; } break; case "-": flat=false; switch (str2.get(3)) { case "+": if(str2.get(2).equals(str1.get(2)) &&str2.get(1).equals(str1.get(1)) ||str2.get(1).equals(str1.get(3)) &&str2.get(2).equals(str1.get(4))){ flat=true; } break; case "-": if(str2.get(0).equals(str1.get(0))){ flat=true; } break; case "/": if(str2.get(0).equals(str1.get(0)) &&str2.get(2).equals(str1.get(2)) &&str2.get(1).equals(str1.get(1))){ flat=true; } break; default: if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) ||str2.get(0).equals(str1.get(4)) &&str2.get(1).equals(str1.get(3))){ flat=true; } break; } break; case "/": flat=false; switch (str2.get(3)) { case "*": flat=true; break; case "/": if(str2.get(4).equals(str1.get(4)) &&str2.get(3).equals(str1.get(3)) ||str2.get(4).equals(str1.get(2)) &&str2.get(3).equals(str1.get(1))){ flat=true; } break; case "+": if(str2.get(4).equals(str1.get(4)) &&str2.get(3).equals(str1.get(3)) ||str2.get(4).equals(str1.get(2)) &&str2.get(3).equals(str1.get(1))){ flat=true; } break; default: if(str2.get(3).equals(str1.get(3)) &&str2.get(4).equals(str1.get(4))){ flat=true; } break; } break; default: flat=false; switch (str2.get(3)) { case "*": if(str2.get(2).equals(str1.get(2)) &&str2.get(1).equals(str1.get(1)) ||str2.get(2).equals(str1.get(4)) &&str2.get(1).equals(str1.get(3))){ flat=true; } break; case "/": if(str2.get(0).equals(str1.get(0))){ flat=true; } break; case "+": if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) &&str2.get(2).equals(str1.get(2)) ||str2.get(0).equals(str1.get(2)) &&str2.get(1).equals(str1.get(3)) &&str2.get(2).equals(str1.get(4))){ flat=true; } break; default: if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) &&str2.get(2).equals(str1.get(2))){ flat=true; } break; } break; } if(flat){ zhuzhifu=true; } } }else{ break; } } return flat; } }
2.優化後的
package com.jm.sizeyunsuan; import java.util.ArrayList; import java.util.List; /** * 查重的總函數 * @author admin * */ public class CongFu { /** * 查重 */ public boolean chacong(List<String> timus,String yunsuan){ boolean flat=false;//獲取是否重複的標記 boolean zhuzhifu=false;//在flat爲true的時候,終止本次循環的標誌 for(String s:timus){ if(!zhuzhifu){ List<String> str=new ArrayList<String>();//獲取已經存入在list中的題目 List<String> str2=new ArrayList<String>();//獲取此次嘗試的題目 for(int i=0;i<s.length();i++){ str.add(s.charAt(i)+""); str2.add(yunsuan.charAt(i)+""); } flat= same(str, str2);//查看符號數字是否是同樣 if(flat){ flat=diaoYong(str,str2);//判斷查重 if(flat){ zhuzhifu=true; } } }else{ break; } } return flat; } /** * 爲了減小代碼塊的過多抽取調用的方法 * @param str list中的題目 * @param str2 如今產生的題目 * @return */ public boolean diaoYong(List<String> str,List<String> str2 ){ CongFuAddAndJian aj=new CongFuAddAndJian(); CongFuChengAndChu cc=new CongFuChengAndChu(); boolean flat=false; switch (str2.get(1)) { case "+": flat=aj.addcopy(str,str2); break; case "-": flat=aj.jiancopy(str,str2); break; case "/": flat=cc.chucopy(str,str2); break; default: flat=cc.chengcopy(str,str2); break; } return flat; } /** * 符號數字同樣 * str1是題目 * str2是本次產生的題目 */ public boolean same(List<String> str1,List<String> str2 ){ boolean flat=false; for(int i=0;i<str1.size();i++){ if(!str1.contains(str2.get(i)) ||!str2.contains(str1.get(i))){ break; }else{ if(i==str1.size()-1){ flat=true; } } } return flat; } }
package com.jm.sizeyunsuan; import java.util.List; /** * 判斷重複的第一個符號爲加減的 * @author * */ public class CongFuAddAndJian { /** * 第一個爲加號判斷重複 * ||以前爲符號位置的一致,||以後的爲符號位置不一樣 */ public boolean addcopy(List<String> str1,List<String> str2){ boolean flat=false; switch (str2.get(3)) { case "+": flat=true; break; case "-": if(str2.get(4).equals(str1.get(4)) &&str2.get(3).equals(str1.get(3)) ||str2.get(3).equals(str1.get(1)) &&str2.get(4).equals(str1.get(2))){ flat=true; } break; case "/": if(str2.get(2).equals(str1.get(2)) &&str2.get(3).equals(str1.get(3)) &&str2.get(4).equals(str1.get(4)) ||str2.get(2).equals(str1.get(0)) &&str2.get(3).equals(str1.get(1)) &&str2.get(4).equals(str1.get(2))){ flat=true; } break; default: if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) ||str2.get(0).equals(str1.get(4)) &&str2.get(1).equals(str1.get(3))){ flat=true; } break; } return flat; } /** * 第一個爲減號判斷重複 * ||以前爲符號位置的一致,||以後的爲符號位置不一樣 */ public boolean jiancopy(List<String> str1,List<String> str2){ boolean flat=false; switch (str2.get(3)) { case "+": if(str2.get(2).equals(str1.get(2)) &&str2.get(1).equals(str1.get(1)) ||str2.get(1).equals(str1.get(3)) &&str2.get(2).equals(str1.get(4))){ flat=true; } break; case "-": if(str2.get(0).equals(str1.get(0))){ flat=true; } break; case "/": if(str2.get(0).equals(str1.get(0)) &&str2.get(2).equals(str1.get(2)) &&str2.get(1).equals(str1.get(1))){ flat=true; } break; default: if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) ||str2.get(0).equals(str1.get(4)) &&str2.get(1).equals(str1.get(3))){ flat=true; } break; } return flat; } }
package com.jm.sizeyunsuan; import java.util.List; /** * 判斷重複的第一個符號爲乘除的 * @author * */ public class CongFuChengAndChu { /** * 第一個爲乘法判斷重複 * ||以前爲符號位置的一致,||以後的爲符號位置不一樣 */ public boolean chengcopy(List<String> str1,List<String> str2){ boolean flat=false; switch (str2.get(3)) { case "*": flat=true; break; case "/": if(str2.get(4).equals(str1.get(4)) &&str2.get(3).equals(str1.get(3)) ||str2.get(4).equals(str1.get(2)) &&str2.get(3).equals(str1.get(1))){ flat=true; } break; case "+": if(str2.get(4).equals(str1.get(4)) &&str2.get(3).equals(str1.get(3)) ||str2.get(4).equals(str1.get(2)) &&str2.get(3).equals(str1.get(1))){ flat=true; } break; default: if(str2.get(3).equals(str1.get(3)) &&str2.get(4).equals(str1.get(4))){ flat=true; } break; } return flat; } /** * 第一個爲除法判斷重複 * ||以前爲符號位置的一致,||以後的爲符號位置不一樣 */ public boolean chucopy(List<String> str1,List<String> str2){ boolean flat=false; switch (str2.get(3)) { case "*": if(str2.get(2).equals(str1.get(2)) &&str2.get(1).equals(str1.get(1)) ||str2.get(2).equals(str1.get(4)) &&str2.get(1).equals(str1.get(3))){ flat=true; } break; case "/": if(str2.get(0).equals(str1.get(0))){ flat=true; } break; case "+": if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) &&str2.get(2).equals(str1.get(2)) ||str2.get(0).equals(str1.get(2)) &&str2.get(1).equals(str1.get(3)) &&str2.get(2).equals(str1.get(4))){ flat=true; } break; default: if(str2.get(0).equals(str1.get(0)) &&str2.get(1).equals(str1.get(1)) &&str2.get(2).equals(str1.get(2))){ flat=true; } break; } return flat; } }