KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sourceforge > pmd > util > Benchmark


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 JavaDoc;
23 import java.io.FileNotFoundException JavaDoc;
24 import java.io.FileReader JavaDoc;
25 import java.io.IOException JavaDoc;
26 import java.util.Collection JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.Set JavaDoc;
30 import java.util.TreeSet JavaDoc;
31
32 public class Benchmark {
33
34     private static class Result implements Comparable JavaDoc {
35         public Rule rule;
36         public long time;
37
38         public int compareTo(Object JavaDoc 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 JavaDoc[] args, String JavaDoc 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 JavaDoc findOptionalStringValue(String JavaDoc[] args, String JavaDoc name, String JavaDoc 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 JavaDoc[] args) throws RuleSetNotFoundException, IOException JavaDoc, PMDException {
74
75         String JavaDoc srcDir = findOptionalStringValue(args, "--source-directory", "/usr/local/java/src/java/lang/");
76         List JavaDoc files = new FileFinder().findFilesFrom(srcDir, new SourceFileOrDirectoryFilter(new SourceFileSelector()), true);
77
78         SourceType jdk = SourceType.JAVA_14;
79         String JavaDoc 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 JavaDoc ruleset = findOptionalStringValue(args, "--ruleset", "");
95             if (debug) System.out.println("Checking directory " + srcDir);
96             Set results = new TreeSet JavaDoc();
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 JavaDoc 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 JavaDoc j = results.iterator(); j.hasNext();) {
111                 Result result = (Result) j.next();
112                 StringBuffer JavaDoc out = new StringBuffer JavaDoc(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 JavaDoc files) throws FileNotFoundException JavaDoc {
125         long start = System.currentTimeMillis();
126         for (Iterator JavaDoc k = files.iterator(); k.hasNext();) {
127             File JavaDoc file = (File JavaDoc) 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 JavaDoc(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 JavaDoc files, Set results, boolean debug) throws PMDException, IOException JavaDoc {
147         Collection JavaDoc rules = ruleSet.getRules();
148         for (Iterator JavaDoc 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 JavaDoc k = files.iterator(); k.hasNext();) {
160                 File JavaDoc file = (File JavaDoc) k.next();
161                 FileReader JavaDoc reader = new FileReader JavaDoc(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 }
173
Popular Tags