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

  

JProfiler的使用的更多相关文章

  1. 部署JProfiler监控tomcat

    下载JProfiler包 wget http://download-keycdn.ej-technologies.com/jprofiler/jprofiler_linux_9_2.rpm 安装JPr ...

  2. Java监控工具介绍,VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,Java微基准测试

    本文是本人前一段时间做一个简单Java监控工具调研总结,主要包括VisualVm ,JProfiler,Perfino,Yourkit,Perf4J,JProbe,以及对Java微基准测试的简单介绍, ...

  3. 转载:JProfiler远程监控LINUX上的Tomcat过程细讲

    来源于xuwanbest的博客   所谓"工欲善其事,必先利其器",好的工具确能起到事半工倍的作用.我用到的最多的就两个JConsole 和JProfiler .JConsole监 ...

  4. JProfiler 8下载地址和注册码

    JProfiler---- 一个很好的java性能监控工具,现在附上下载地址和注册码,此破解版仅供学习交流使用, 其他用途请购买正版授权!!!windows x64 zip下载地址:http://do ...

  5. JProfiler

    1  前言 回答之前先让我们来看看什么是jProfiler:JProfiler是一个商业授权的Java剖析工具,由EJ技术有限公司,针对Java EE和Java SE应用程序开发的.它允许两个内存剖面 ...

  6. JProfiler学习笔记

    JProfiler学习笔记   一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请试用序列号   二.主要功能简介 1.内存 ...

  7. jprofiler安装图解

    环境: 1.sun jdk1.6.0 2.jprofiler_windows_6_0_2.exe 安装 1. jdk, 安装略... 2. jprofiler安装 一路next 到Enter lice ...

  8. 循序渐进 Jprofiler

    一 Jprofiler 1 什么是Jprofiler JProfiler是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程式.它把CPU.线程和内存的剖析组合在一个 ...

  9. JProfiler使用入门(一)——准备工作

      JProfiler是一个全功能的Java剖析工具(profiler),主要用于检查和跟踪系统(限于Java开发的)的性能. JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收 ...

  10. JProfiler使用详细教程学习笔记

    JProfiler学习笔记    推荐文章:JProfiler 入门教程 一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请 ...

随机推荐

  1. Alpha版本 - 用户反馈

    Alpha版本 - 用户反馈 使用情况 (前天发出了内测apk给身边的人小范围使用,到目前共有31名用户使用过产品) 新增用户数: 用户事件数: Bug反馈 登录/注册出现"无响应" ...

  2. Python 使用 xlwings 往 excel中写入一列数据的两种方法

    1.准备一个二维列表,然后再range后面不指定任何选项,可以输出该二维列表中数据在一列中显示,如下代码: # -*- coding:utf-8 -*- import xlwings as xw li ...

  3. Spring AOP的实现研究

    1. 背景 在前文Spring IOC容器创建bean过程浅析已经介绍了Spring IOC创建初始化bean的大致过程.现在对Spring的AOP实现机制进行研究分析. 2. 名词与概念 名词 概念 ...

  4. javascript 正则表达式学习

    正则表达式 正则表达式,一个描述字符模式的对象.javascript的RegExp类表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进行强大的模式和匹配与替换功能. -- f ...

  5. 关于hover和after、before合用

    通常hover后面跟的选择器,都是在myClass结构之下 的dom元素. 如果想在myClass下添加after等,就需要两个::号. 注:after/before是属于myclass的下级元素,并 ...

  6. c++11の的左值、右值以及move,foward

    左值和右值的定义 在C++中,可以放到赋值操作符=左边的是左值,可以放到赋值操作符右边的是右值.有些变量既可以当左值又可以当右值.进一步来讲,左值为Lvalue,其实L代表Location,表示在内存 ...

  7. Android中如何使用xmlns

    http://blog.csdn.net/lihenair/article/details/41009711 工作中时常需要自定义控件,除了按键,draw以外,还需要对控件属性进行一些初始化的操作,比 ...

  8. 使用OPEN XML SDK 读取EXCEL中的超链接Hyperlink

    使用OPEN XML SDK 读取EXCEL中的超链接Hyperlink 原理 先创建一个包括全部EXCEL单元格中超链接Hyperlink数据的表,再定位单元格通过列头(如A1,B1)获取超链接信息 ...

  9. WordPress数据库及各表结构分析

    默认WordPress一共有以下11个表.这里加上了默认的表前缀 wp_ . wp_commentmeta:存储评论的元数据wp_comments:存储评论wp_links:存储友情链接(Blogro ...

  10. 蒟蒻qxt的sd'日常

    emm... 今天刷了一道水题 居然 死循环了 真的是水题啊 顿时自闭 (救救孩子吧) 结果 bug是 我把for循环中的i的值改变了 使得i的值一直都不会达到他的边界值 于是就死循环了 所以 要用到 ...