From 079526d732893596ae1e30ed122420f2269d25ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=B6=C2=A1=C3=93=C3=AE?= Date: Wed, 18 Apr 2012 11:53:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Wiki=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README b/README index 4695466..acc54c2 100644 --- a/README +++ b/README @@ -1,7 +1,10 @@ -TProfiler is a code profiling tool. - -author:shutong.dy@taobao.com - -Note: TProfiler requires Java5™ VM. - +TProfiler is a code profiling tool. + +author:shutong.dy@taobao.com + +Note: TProfiler requires Java5™ VM. + +Please refer to Wiki for more information: +https://github.com/taobao/TProfiler/wiki + The source code is available using the GPL version 2. We are actively looking for contributors, so if you have any ideas, bug reports, or patches you would like to contribute please do not hesitate to do that. \ No newline at end of file From 612b10b9f1262e8dd3482facd6705011a6af0ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C2=B6=C2=A1=C3=93=C3=AE?= Date: Wed, 18 Apr 2012 17:07:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=83=AD=E7=82=B9?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E5=88=9B=E5=BB=BA=E5=88=86=E6=9E=90=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/tprofiler.jar | Bin 86809 -> 85760 bytes .../profile/analysis/ProfilerLogAnalysis.java | 502 +++++++++--------- 2 files changed, 258 insertions(+), 244 deletions(-) diff --git a/dist/tprofiler.jar b/dist/tprofiler.jar index 92ea03a4efdb7963423b50415d9d43472fcd9a7a..f60fc5c4257cd53353f49ee04deda4a375f3edbb 100644 GIT binary patch delta 39013 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 V(v1WJ+R$GqGvpOi1yZyG{|DhpMuh+X diff --git a/src/main/java/com/taobao/profile/analysis/ProfilerLogAnalysis.java b/src/main/java/com/taobao/profile/analysis/ProfilerLogAnalysis.java index af3a27e..818f026 100644 --- a/src/main/java/com/taobao/profile/analysis/ProfilerLogAnalysis.java +++ b/src/main/java/com/taobao/profile/analysis/ProfilerLogAnalysis.java @@ -1,244 +1,258 @@ -/** - * (C) 2011-2012 Alibaba Group Holding Limited. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 2 as published by the Free Software Foundation. - * - */ -package com.taobao.profile.analysis; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -/** - * 分析Profiler生成的Log - * - * @author shutong.dy - * @since 2012-1-11 - */ -public class ProfilerLogAnalysis { - - private String logPath; - private String methodPath; - private boolean nano; - private long currentthreadId = -1; - private List threadList = new ArrayList(); - private Map cacheMethodMap = new HashMap(); - private Map methodIdMap = new HashMap(); - - /** - * @param args - */ - public static void main(String[] args) { - if (args.length != 3) { - System.err.println("Usage: "); - return; - } - ProfilerLogAnalysis analysis = new ProfilerLogAnalysis(args[0], args[1]); - analysis.reader(); - analysis.printResult(args[2]); - } - - /** - * @param inPath - * @param methodPath - */ - public ProfilerLogAnalysis(String inPath, String methodPath) { - this.logPath = inPath; - this.methodPath = methodPath; - } - - /** - * 取出结果,供分析程序调用 - * - * @return - */ - public List getTimeSortData() { - List list = new ArrayList(); - list.addAll(cacheMethodMap.values()); - Collections.sort(list); - return list; - } - - /** - * 读取log,并解析 - */ - private void reader() { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(methodPath)); - String line = null; - while ((line = reader.readLine()) != null) { - if (line.startsWith("instrument")) { - continue; - } - String[] data = line.split(" "); - if (data.length != 2) { - continue; - } - methodIdMap.put(Long.parseLong(data[0]), String.valueOf(data[1])); - } - reader.close(); - - reader = new BufferedReader(new FileReader(logPath)); - line = null; - while ((line = reader.readLine()) != null) { - if (line.startsWith("##")) { - line = line.substring(line.indexOf(":") + 1, line.length()); - if (line.equals("true")) { - nano = true; - } else { - nano = false; - } - continue; - } - String[] data = line.split("\t"); - if (data.length != 4) { - continue; - } - merge(Long.parseLong(data[0]), Long.parseLong(data[1]), Long.parseLong(data[2]), - Long.parseLong(data[3])); - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - doMerge(); - } - - /** - * 合并数据 - * - * @param threadid - * @param stackNum - * @param methodId - * @param useTime - */ - private void merge(long threadid, long stackNum, long methodId, long useTime) { - if (currentthreadId != threadid) { - currentthreadId = threadid; - doMerge(); - } - MethodStack m = new MethodStack(); - m.methodId = methodId; - m.useTime = useTime; - m.stackNum = stackNum; - threadList.add(m); - } - - /** - * 合并数据 - */ - private void doMerge() { - for (int i = 0; i < threadList.size(); i++) { - MethodStack m = threadList.get(i); - long statck = m.stackNum; - for (int j = i + 1; j < threadList.size(); j++) { - MethodStack tmp = threadList.get(j); - long tmpStack = tmp.stackNum; - if (tmpStack - statck == 1) { - m.useTime -= tmp.useTime; - } else if (tmpStack - statck <= 0) { - break; - } - } - } - for (int i = 0; i < threadList.size(); i++) { - MethodStack m = threadList.get(i); - if (m.useTime < 0) { - break; - } - TimeSortData sortData = cacheMethodMap.get(m.methodId); - if (sortData == null) { - sortData = new TimeSortData(); - sortData.methodName = methodIdMap.get(m.methodId); - sortData.valueStack.add(m.useTime); - sortData.size++; - cacheMethodMap.put(m.methodId, sortData); - } else { - sortData.valueStack.add(m.useTime); - sortData.size++; - } - } - threadList.clear(); - } - - /** - * 输出分析结果 - */ - public void printResult(String outPath) { - List list = new ArrayList(); - list.addAll(cacheMethodMap.values()); - Collections.sort(list); - - BufferedWriter writer = null; - try { - writer = new BufferedWriter(new FileWriter(outPath)); - for (TimeSortData data : list) { - StringBuilder sb = new StringBuilder(); - Stack stack = data.valueStack; - - long executeNum = stack.size(); - long allTime; - if (nano) { - allTime = Math.div(data.sum, 1000000); - } else { - allTime = data.sum; - } - long useTime = Math.div(allTime, executeNum); - sb.append(data.methodName); - sb.append("\t"); - sb.append(executeNum); - sb.append("\t"); - sb.append(useTime); - sb.append("\t"); - sb.append(allTime); - sb.append("\n"); - writer.write(sb.toString()); - } - writer.flush(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - /** - * 方法栈 - * - * @author shutong.dy - * @since 2012-1-11 - */ - private class MethodStack { - private long methodId; - private long useTime; - private long stackNum; - } -} +/** + * (C) 2011-2012 Alibaba Group Holding Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + */ +package com.taobao.profile.analysis; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +/** + * 分析Profiler生成的Log + * + * @author shutong.dy + * @since 2012-1-11 + */ +public class ProfilerLogAnalysis { + + private String logPath; + private String methodPath; + private boolean nano; + private long currentthreadId = -1; + private List threadList = new ArrayList(); + private Map cacheMethodMap = new HashMap(); + private Map methodIdMap = new HashMap(); + + /** + * @param args + */ + public static void main(String[] args) { + if (args.length != 4) { + System.err + .println("Usage: "); + return; + } + ProfilerLogAnalysis analysis = new ProfilerLogAnalysis(args[0], args[1]); + analysis.reader(); + analysis.printResult(args[2], args[3]); + } + + /** + * @param inPath + * @param methodPath + */ + public ProfilerLogAnalysis(String inPath, String methodPath) { + this.logPath = inPath; + this.methodPath = methodPath; + } + + /** + * 取出结果,供分析程序调用 + * + * @return + */ + public List getTimeSortData() { + List list = new ArrayList(); + list.addAll(cacheMethodMap.values()); + Collections.sort(list); + return list; + } + + /** + * 读取log,并解析 + */ + private void reader() { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader(methodPath)); + String line = null; + while ((line = reader.readLine()) != null) { + if (line.startsWith("instrument")) { + continue; + } + String[] data = line.split(" "); + if (data.length != 2) { + continue; + } + methodIdMap.put(Long.parseLong(data[0]), String.valueOf(data[1])); + } + reader.close(); + + reader = new BufferedReader(new FileReader(logPath)); + line = null; + while ((line = reader.readLine()) != null) { + if (line.startsWith("##")) { + line = line.substring(line.indexOf(":") + 1, line.length()); + if (line.equals("true")) { + nano = true; + } else { + nano = false; + } + continue; + } + String[] data = line.split("\t"); + if (data.length != 4) { + continue; + } + merge(Long.parseLong(data[0]), Long.parseLong(data[1]), Long.parseLong(data[2]), + Long.parseLong(data[3])); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + doMerge(); + } + + /** + * 合并数据 + * + * @param threadid + * @param stackNum + * @param methodId + * @param useTime + */ + private void merge(long threadid, long stackNum, long methodId, long useTime) { + if (currentthreadId != threadid) { + currentthreadId = threadid; + doMerge(); + } + MethodStack m = new MethodStack(); + m.methodId = methodId; + m.useTime = useTime; + m.stackNum = stackNum; + threadList.add(m); + } + + /** + * 合并数据 + */ + private void doMerge() { + for (int i = 0; i < threadList.size(); i++) { + MethodStack m = threadList.get(i); + long statck = m.stackNum; + for (int j = i + 1; j < threadList.size(); j++) { + MethodStack tmp = threadList.get(j); + long tmpStack = tmp.stackNum; + if (tmpStack - statck == 1) { + m.useTime -= tmp.useTime; + } else if (tmpStack - statck <= 0) { + break; + } + } + } + for (int i = 0; i < threadList.size(); i++) { + MethodStack m = threadList.get(i); + if (m.useTime < 0) { + break; + } + TimeSortData sortData = cacheMethodMap.get(m.methodId); + if (sortData == null) { + sortData = new TimeSortData(); + sortData.methodName = methodIdMap.get(m.methodId); + sortData.valueStack.add(m.useTime); + sortData.size++; + cacheMethodMap.put(m.methodId, sortData); + } else { + sortData.valueStack.add(m.useTime); + sortData.size++; + } + } + threadList.clear(); + } + + /** + * 输出分析结果 + */ + public void printResult(String topMethodPath, String topObjectPath) { + List list = new ArrayList(); + list.addAll(cacheMethodMap.values()); + Collections.sort(list); + + BufferedWriter topMethodWriter = null; + BufferedWriter topObjectWriter = null; + try { + topMethodWriter = new BufferedWriter(new FileWriter(topMethodPath)); + topObjectWriter = new BufferedWriter(new FileWriter(topObjectPath)); + for (TimeSortData data : list) { + StringBuilder sb = new StringBuilder(); + Stack stack = data.valueStack; + + long executeNum = stack.size(); + long allTime; + if (nano) { + allTime = Math.div(data.sum, 1000000); + } else { + allTime = data.sum; + } + long useTime = Math.div(allTime, executeNum); + sb.append(data.methodName); + sb.append("\t"); + sb.append(executeNum); + sb.append("\t"); + sb.append(useTime); + sb.append("\t"); + sb.append(allTime); + sb.append("\n"); + topMethodWriter.write(sb.toString()); + if (data.methodName != null && data.methodName.contains("")) { + topObjectWriter.write(sb.toString()); + } + } + topMethodWriter.flush(); + topObjectWriter.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (topMethodWriter != null) { + try { + topMethodWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (topObjectWriter != null) { + try { + topObjectWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + /** + * 方法栈 + * + * @author shutong.dy + * @since 2012-1-11 + */ + private class MethodStack { + private long methodId; + private long useTime; + private long stackNum; + } +}