JProfiler的使用

时间:2022-07-27 21:29:07

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

2.使用过程

JProfiler的使用

1.点击此图的new Session

JProfiler的使用

2.点击左边application settings,右边要点击

JProfiler的使用

3.点击的Source Path ,点击+号的图标,点击add directory

JProfiler的使用

4.点击你工程的文件到bin

JProfiler的使用

5.左边是程序还没有运行的,右边是查询运行的

JProfiler的使用JProfiler的使用

6.点击你的项目双击俩下,或者点open,之后点击OK就好了

JProfiler的使用

7.点击CPU view,点击Call Tree,之后点击界面的一个按钮

JProfiler的使用

8.这是一张CUP的图,图中显示个个方法的使用占的CPU

JProfiler的使用

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