1 package net.sourceforge.pmd.benchmark;
2
3 import java.io.PrintStream;
4 import java.text.MessageFormat;
5 import java.util.ArrayList;
6 import java.util.Collections;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.Set;
10
11 import net.sourceforge.pmd.PMD;
12 import net.sourceforge.pmd.util.StringUtil;
13
14
15
16
17
18 public class TextReport implements BenchmarkReport {
19
20
21 private static final int TIME_COLUMN = 48;
22 private static final int NAME_COLUMN_WIDTH = 50;
23 private static final int VALUE_COLUMN_WIDTH = 8;
24
25 public TextReport() {
26
27 }
28
29
30
31
32
33
34
35 public void generate(Set<RuleDuration> stressResults, PrintStream out) {
36
37 out.println("=========================================================");
38 out.println("Rule\t\t\t\t\t\tTime in ms");
39 out.println("=========================================================");
40
41 for (RuleDuration result: stressResults) {
42 StringBuilder buffer = new StringBuilder(result.rule.getName());
43 while (buffer.length() < TIME_COLUMN) {
44 buffer.append(' ');
45 }
46 buffer.append(result.time);
47 out.println(out.toString());
48 }
49
50 out.println("=========================================================");
51 }
52
53
54
55
56
57 public void report(Map<String, BenchmarkResult> benchmarksByName) {
58 generate(benchmarksByName, System.out);
59 }
60
61
62
63
64
65
66
67 public void generate(Map<String, BenchmarkResult> benchmarksByName, PrintStream out) {
68
69 List<BenchmarkResult> results = new ArrayList<BenchmarkResult>(benchmarksByName.values());
70
71 long[] totalTime = new long[Benchmark.TotalPMD.index + 1];
72 long[] totalCount = new long[Benchmark.TotalPMD.index + 1];
73
74 for (BenchmarkResult benchmarkResult: results) {
75 totalTime[benchmarkResult.type.index] += benchmarkResult.getTime();
76 totalCount[benchmarkResult.type.index] += benchmarkResult.getCount();
77 if (benchmarkResult.type.index < Benchmark.MeasuredTotal.index) {
78 totalTime[Benchmark.MeasuredTotal.index] += benchmarkResult.getTime();
79 }
80 }
81 results.add(new BenchmarkResult(Benchmark.RuleTotal, totalTime[Benchmark.RuleTotal.index], 0));
82 results.add(new BenchmarkResult(Benchmark.RuleChainTotal, totalTime[Benchmark.RuleChainTotal.index], 0));
83 results.add(new BenchmarkResult(Benchmark.MeasuredTotal, totalTime[Benchmark.MeasuredTotal.index], 0));
84 results.add(new BenchmarkResult(Benchmark.NonMeasuredTotal, totalTime[Benchmark.TotalPMD.index] - totalTime[Benchmark.MeasuredTotal.index], 0));
85 Collections.sort(results);
86
87 StringBuilderCR buf = new StringBuilderCR(PMD.EOL);
88 boolean writeRuleHeader = true;
89 boolean writeRuleChainRuleHeader = true;
90 long ruleCount = 0;
91 long ruleChainCount = 0;
92
93 for (BenchmarkResult benchmarkResult: results) {
94 StringBuilder buf2 = new StringBuilder(benchmarkResult.name);
95 buf2.append(':');
96 while (buf2.length() <= NAME_COLUMN_WIDTH) {
97 buf2.append(' ');
98 }
99 String result = MessageFormat.format("{0,number,0.000}", Double.valueOf(benchmarkResult.getTime()/1000000000.0));
100 buf2.append(StringUtil.lpad(result, VALUE_COLUMN_WIDTH));
101 if (benchmarkResult.type.index <= Benchmark.RuleChainRule.index) {
102 buf2.append(StringUtil.lpad(MessageFormat.format("{0,number,###,###,###,###,###}", benchmarkResult.getCount()), 20));
103 }
104 switch (benchmarkResult.type) {
105 case Rule:
106 if (writeRuleHeader) {
107 writeRuleHeader = false;
108 buf.appendLn();
109 buf.appendLn("---------------------------------<<< Rules >>>---------------------------------");
110 buf.appendLn("Rule name Time (secs) # of Evaluations");
111 buf.appendLn();
112 }
113 ruleCount++;
114 break;
115 case RuleChainRule:
116 if (writeRuleChainRuleHeader) {
117 writeRuleChainRuleHeader = false;
118 buf.appendLn();
119 buf.appendLn("----------------------------<<< RuleChain Rules >>>----------------------------");
120 buf.appendLn("Rule name Time (secs) # of Visits");
121 buf.appendLn();
122 }
123 ruleChainCount++;
124 break;
125 case CollectFiles:
126 buf.appendLn();
127 buf.appendLn("--------------------------------<<< Summary >>>--------------------------------");
128 buf.appendLn("Segment Time (secs)");
129 buf.appendLn();
130 break;
131 case MeasuredTotal:
132 String s = MessageFormat.format("{0,number,###,###,###,###,###}", ruleCount);
133 String t = MessageFormat.format("{0,number,0.000}", ruleCount==0 ? 0 : total(totalTime,Benchmark.Rule,ruleCount));
134 buf.appendLn("Rule Average (", s, " rules):", StringUtil.lpad(t, 37-s.length()));
135 s = MessageFormat.format("{0,number,###,###,###,###,###}", ruleChainCount);
136 t = MessageFormat.format("{0,number,0.000}", ruleChainCount==0 ? 0 : total(totalTime,Benchmark.RuleChainRule, ruleChainCount));
137 buf.appendLn("RuleChain Average (", s, " rules):", StringUtil.lpad(t, 32-s.length()));
138
139 buf.appendLn();
140 buf.appendLn("-----------------------------<<< Final Summary >>>-----------------------------");
141 buf.appendLn("Total Time (secs)");
142 buf.appendLn();
143 break;
144 default:
145
146 break;
147 }
148 buf.appendLn(buf2.toString());
149 }
150
151 out.print(buf.toString());
152 }
153
154
155
156
157
158
159
160
161 private static double total(long[] timeTotals, Benchmark index, long count) {
162 return timeTotals[index.index]/1000000000.0d/count;
163 }
164 }