JProfiler的使用


1.下載地址:http://www.ej-technologies.com/download/jprofiler/files

2.使用過程

 

1.點擊此圖的new Session

2.點擊左邊application settings,右邊要點擊

3.點擊的Source Path ,點擊+號的圖標,點擊add directory

 

4.點擊你工程的文件到bin

5.左邊是程序還沒有運行的,右邊是查詢運行的

6.點擊你的項目雙擊倆下,或者點open,之后點擊OK就好了

 

 7.點擊CPU view,點擊Call Tree,之后點擊界面的一個按鈕

8.這是一張CUP的圖,圖中顯示個個方法的使用占的CPU

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

}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM