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 }