View Javadoc

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  }