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.cpd.FileFinder;
11 import net.sourceforge.pmd.cpd.JavaLanguage;
12
13 import java.io.File;
14 import java.io.FileReader;
15 import java.io.IOException;
16 import java.util.Iterator;
17 import java.util.List;
18 import java.util.Set;
19 import java.util.TreeSet;
20
21 public class Benchmark {
22
23 private static class Result implements Comparable {
24 public Rule rule;
25 public long time;
26
27 public int compareTo(Object o) {
28 Result other = (Result)o;
29 if (other.time < time) {
30 return -1;
31 } else if (other.time > time) {
32 return 1;
33 }
34 return 0;
35 }
36
37 public Result(long elapsed, Rule rule) {
38 this.rule = rule;
39 this.time = elapsed;
40 }
41 }
42
43 private static final String JAVA_SRC_DIR = "/usr/local/java/src/java/lang/";
44 private static final boolean DEBUG = false;
45
46 public static void main(String[] args) throws RuleSetNotFoundException, IOException, PMDException {
47 Set results = new TreeSet();
48
49 FileFinder finder = new FileFinder();
50 List files = finder.findFilesFrom(JAVA_SRC_DIR, new JavaLanguage.JavaFileOrDirectoryFilter(), true);
51
52 RuleSetFactory factory = new RuleSetFactory();
53 Iterator i = factory.getRegisteredRuleSets();
54 while (i.hasNext()) {
55 stress((RuleSet)i.next(), files, results);
56 }
57 System.out.println("=========================================================");
58 System.out.println("Rule\t\t\t\t\t\tTime in ms");
59 System.out.println("=========================================================");
60 for (Iterator j = results.iterator(); j.hasNext();) {
61 Result result = (Result)j.next();
62
63 StringBuffer out = new StringBuffer(result.rule.getName());
64 while (out.length() < 48) {
65 out.append(' ');
66 }
67 out.append(result.time);
68 System.out.println(out.toString());
69 }
70 System.out.println("=========================================================");
71 }
72
73 private static void stress(RuleSet ruleSet, List files, Set results) throws PMDException, IOException {
74 Set rules = ruleSet.getRules();
75 for (Iterator j = rules.iterator(); j.hasNext();) {
76 Rule rule = (Rule)j.next();
77 if (DEBUG) System.out.println("Starting " + rule.getName());
78
79 RuleSet working = new RuleSet();
80 working.addRule(rule);
81
82 PMD p = new PMD();
83 RuleContext ctx = new RuleContext();
84 long start = System.currentTimeMillis();
85 for (Iterator k = files.iterator(); k.hasNext();) {
86 File file = (File)k.next();
87 FileReader reader = new FileReader(file);
88 ctx.setSourceCodeFilename(file.getName());
89 p.processFile(reader, working, ctx);
90 reader.close();
91 }
92 long end = System.currentTimeMillis();
93 long elapsed = end - start;
94 results.add(new Result(elapsed, rule));
95 if (DEBUG) System.out.println("Done timing " + rule.getName() + "; elapsed time was " + elapsed);
96 }
97 }
98 }