1 package net.sourceforge.pmd.util;
2
3 import net.sourceforge.pmd.PMD;
4 import net.sourceforge.pmd.PMDException;
5 import net.sourceforge.pmd.Rule;
6 import net.sourceforge.pmd.RuleContext;
7 import net.sourceforge.pmd.RuleSet;
8 import net.sourceforge.pmd.RuleSetFactory;
9 import net.sourceforge.pmd.RuleSetNotFoundException;
10 import net.sourceforge.pmd.SimpleRuleSetNameMapper;
11 import net.sourceforge.pmd.SourceFileSelector;
12 import net.sourceforge.pmd.SourceType;
13 import net.sourceforge.pmd.TargetJDK1_3;
14 import net.sourceforge.pmd.TargetJDK1_4;
15 import net.sourceforge.pmd.TargetJDK1_5;
16 import net.sourceforge.pmd.TargetJDK1_6;
17 import net.sourceforge.pmd.TargetJDKVersion;
18 import net.sourceforge.pmd.ast.JavaParser;
19 import net.sourceforge.pmd.cpd.FileFinder;
20 import net.sourceforge.pmd.cpd.SourceFileOrDirectoryFilter;
21
22 import java.io.File;
23 import java.io.FileNotFoundException;
24 import java.io.FileReader;
25 import java.io.IOException;
26 import java.util.Collection;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Set;
30 import java.util.TreeSet;
31
32 public class Benchmark {
33
34 private static class Result implements Comparable {
35 public Rule rule;
36 public long time;
37
38 public int compareTo(Object o) {
39 Result other = (Result) o;
40 if (other.time < time) {
41 return -1;
42 } else if (other.time > time) {
43 return 1;
44 }
45
46 return rule.getName().compareTo(((Result) o).rule.getName());
47 }
48
49 public Result(long elapsed, Rule rule) {
50 this.rule = rule;
51 this.time = elapsed;
52 }
53 }
54
55 private static boolean findBooleanSwitch(String[] args, String name) {
56 for (int i = 0; i < args.length; i++) {
57 if (args[i].equals(name)) {
58 return true;
59 }
60 }
61 return false;
62 }
63
64 private static String findOptionalStringValue(String[] args, String name, String defaultValue) {
65 for (int i = 0; i < args.length; i++) {
66 if (args[i].equals(name)) {
67 return args[i + 1];
68 }
69 }
70 return defaultValue;
71 }
72
73 public static void main(String[] args) throws RuleSetNotFoundException, IOException, PMDException {
74
75 String srcDir = findOptionalStringValue(args, "--source-directory", "/usr/local/java/src/java/lang/");
76 List files = new FileFinder().findFilesFrom(srcDir, new SourceFileOrDirectoryFilter(new SourceFileSelector()), true);
77
78 SourceType jdk = SourceType.JAVA_14;
79 String targetjdk = findOptionalStringValue(args, "--targetjdk", "1.4");
80 if (targetjdk.equals("1.3")) {
81 jdk = SourceType.JAVA_13;
82 } else if (targetjdk.equals("1.5")) {
83 jdk = SourceType.JAVA_15;
84 } else if (targetjdk.equals("1.6")) {
85 jdk = SourceType.JAVA_16;
86 }
87 boolean debug = findBooleanSwitch(args, "--debug");
88 boolean parseOnly = findBooleanSwitch(args, "--parse-only");
89
90 if (debug) System.out.println("Using JDK " + jdk.getId());
91 if (parseOnly) {
92 parseStress(jdk, files);
93 } else {
94 String ruleset = findOptionalStringValue(args, "--ruleset", "");
95 if (debug) System.out.println("Checking directory " + srcDir);
96 Set results = new TreeSet();
97 RuleSetFactory factory = new RuleSetFactory();
98 if (ruleset.length() > 0) {
99 SimpleRuleSetNameMapper mapper = new SimpleRuleSetNameMapper(ruleset);
100 stress(jdk, factory.createSingleRuleSet(mapper.getRuleSets()), files, results, debug);
101 } else {
102 Iterator i = factory.getRegisteredRuleSets();
103 while (i.hasNext()) {
104 stress(jdk, (RuleSet) i.next(), files, results, debug);
105 }
106 }
107 System.out.println("=========================================================");
108 System.out.println("Rule\t\t\t\t\t\tTime in ms");
109 System.out.println("=========================================================");
110 for (Iterator j = results.iterator(); j.hasNext();) {
111 Result result = (Result) j.next();
112 StringBuffer out = new StringBuffer(result.rule.getName());
113 while (out.length() < 48) {
114 out.append(' ');
115 }
116 out.append(result.time);
117 System.out.println(out.toString());
118 }
119 }
120
121 System.out.println("=========================================================");
122 }
123
124 private static void parseStress(SourceType t, List files) throws FileNotFoundException {
125 long start = System.currentTimeMillis();
126 for (Iterator k = files.iterator(); k.hasNext();) {
127 File file = (File) k.next();
128 TargetJDKVersion jdk;
129 if (t.equals(SourceType.JAVA_13)) {
130 jdk = new TargetJDK1_3();
131 } else if (t.equals(SourceType.JAVA_14)) {
132 jdk = new TargetJDK1_4();
133 } else if (t.equals(SourceType.JAVA_15)) {
134 jdk = new TargetJDK1_5();
135 } else {
136 jdk = new TargetJDK1_6();
137 }
138 JavaParser parser = jdk.createParser(new FileReader(file));
139 parser.CompilationUnit();
140 }
141 long end = System.currentTimeMillis();
142 long elapsed = end - start;
143 System.out.println("That took " + elapsed + " ms");
144 }
145
146 private static void stress(SourceType t, RuleSet ruleSet, List files, Set results, boolean debug) throws PMDException, IOException {
147 Collection rules = ruleSet.getRules();
148 for (Iterator j = rules.iterator(); j.hasNext();) {
149 Rule rule = (Rule) j.next();
150 if (debug) System.out.println("Starting " + rule.getName());
151
152 RuleSet working = new RuleSet();
153 working.addRule(rule);
154
155 PMD p = new PMD();
156 p.setJavaVersion(t);
157 RuleContext ctx = new RuleContext();
158 long start = System.currentTimeMillis();
159 for (Iterator k = files.iterator(); k.hasNext();) {
160 File file = (File) k.next();
161 FileReader reader = new FileReader(file);
162 ctx.setSourceCodeFilename(file.getName());
163 p.processFile(reader, working, ctx);
164 reader.close();
165 }
166 long end = System.currentTimeMillis();
167 long elapsed = end - start;
168 results.add(new Result(elapsed, rule));
169 if (debug) System.out.println("Done timing " + rule.getName() + "; elapsed time was " + elapsed);
170 }
171 }
172 }