From 6af9357ba1480bced98ed1b23c055b89fd74900f Mon Sep 17 00:00:00 2001 From: hns Date: Mon, 28 Sep 2009 13:07:59 +0000 Subject: [PATCH] Improve formatting of compiler output --- src/helma/scripting/rhino/debug/Profiler.java | 14 ++++++++++--- src/helma/util/StringUtils.java | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/helma/scripting/rhino/debug/Profiler.java b/src/helma/scripting/rhino/debug/Profiler.java index c5e05298..fcd7556d 100644 --- a/src/helma/scripting/rhino/debug/Profiler.java +++ b/src/helma/scripting/rhino/debug/Profiler.java @@ -8,6 +8,8 @@ import org.mozilla.javascript.Scriptable; import java.util.*; +import helma.util.StringUtils; + public class Profiler implements Debugger { HashMap frames = new HashMap(); @@ -64,10 +66,16 @@ public class Profiler implements Debugger { return ((ProfilerFrame)o2).runtime - ((ProfilerFrame)o1).runtime; } }); + int length = Math.min(100, f.length); + int prefixLength = Integer.MAX_VALUE; + for (int i = 0; i < length - 1; i++) { + prefixLength = Math.min(prefixLength, + StringUtils.getCommonPrefix(f[i].name, f[i+1].name).length()); + } StringBuffer buffer = new StringBuffer(" total average calls path\n"); buffer.append("==================================================================\n"); - for (int i = 0; i < Math.min(100, f.length); i++) { - buffer.append(f[i].renderLine(0)); + for (int i = 0; i < length; i++) { + buffer.append(f[i].renderLine(prefixLength)); } return buffer.toString(); } @@ -134,7 +142,7 @@ public class Profiler implements Debugger { Integer.valueOf(invocations), name.substring(prefixLength) }; - formatter.format("%1$7d ms %2$5d ms %3$6d %4$s%n", args); + formatter.format("%1$7d ms %2$5d ms %3$6d %4$s%n", args); return formatter.toString(); } } diff --git a/src/helma/util/StringUtils.java b/src/helma/util/StringUtils.java index 512ab4ff..e23ef35b 100644 --- a/src/helma/util/StringUtils.java +++ b/src/helma/util/StringUtils.java @@ -84,4 +84,25 @@ public class StringUtils { return (String[]) list.toArray(new String[list.size()]); } + /** + * Get the largest common prefix of Strings s1 and s2 + * @param s1 a string + * @param s2 another string + * @return the largest prefix shared by both strings + */ + public static String getCommonPrefix(String s1, String s2) { + if (s1.indexOf(s2) == 0) { + return s2; + } else if (s2.indexOf(s1) == 0) { + return s1; + } + int length = Math.min(s1.length(), s2.length()); + for (int i = 0; i < length; i++) { + if (s1.charAt(i) != s2.charAt(i)) { + return s1.substring(0, i); + } + } + return s1.substring(0, length); + } + }