/* * This file is part of the X10 project (http://x10-lang.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.opensource.org/licenses/eclipse-1.0.php * * (C) Copyright IBM Corporation 2006-2010. */ /** * @author bdlucas */ import java.util.*; import java.io.*; class Report { static PrintStream out = System.out; static PrintWriter changed; static Set<String> tests = new LinkedHashSet(); static Set<String> lgcs = new LinkedHashSet(); static class Entries { HashMap<String,Collection<Entry>> map = new HashMap<String,Collection<Entry>>(); HashMap<String,Entry> shown = new HashMap<String,Entry>(); private String key(String test, String lgc) { return test + "," + lgc; } void put(Entry e) { String key = key(e.get("test"), e.get("lg-code")); Collection<Entry> l = map.get(key); if (l==null) { l = new TreeSet<Entry>(); map.put(key, l); } l.add(e); } Collection<Entry> get(String test, String lgc) { String key = key(test, lgc); Collection<Entry> l = map.get(key); return l; } void putShown(Entry e) { String key = key(e.get("test"), e.get("lg-code")); shown.put(key, e); } Entry getShown(String test, String lgc) { String key = key(test, lgc); return shown.get(key); } } static Entries entries = new Entries(); static class Entry extends HashMap<String,String> implements Comparable<Entry> { // identifying letter for this entry char letter; // create entry, parsing n/v pairs Entry(String line) { String [] nvs = line.split(" "); for (int i=0; i<nvs.length; i++) { String [] nv = nvs[i].split("="); put(nv[0], nv[1]); } put("lg-code", get("lg") + "-" + get("code")); put("date-time", get("date") + " " + get("time")); tests.add(get("test")); lgcs.add(get("lg-code")); entries.put(this); } double ops() { return Double.parseDouble(get("ops")); } public int compareTo(Entry that) { return this.get("date-time").compareTo(that.get("date-time")); } public String toString() { return "[" + letter + "," + get("test") + "," + get("lg-code") + "]"; } } public static void main(String args[]) throws Exception { // log significant changes, print at end StringWriter changes = new StringWriter(); changed = new PrintWriter(changes); // order of known tests tests.add("SeqRail2"); tests.add("SeqPseudoArray2a"); tests.add("SeqPseudoArray2b"); tests.add("SeqArray2a"); tests.add("SeqArray2b"); tests.add("SeqUTSBin1"); tests.add("ParUTSBin1"); tests.add("SeqMatMultAdd1a"); tests.add("SeqStream1"); tests.add("ParStream1"); tests.add("DistStream1"); tests.add("SeqRandomAccess1"); tests.add("ParRandomAccess1"); tests.add("DistRandomAccess1"); // order of known columns lgcs.add("cpp-opt"); lgcs.add("x10-cpp-opt"); lgcs.add("java-opt"); lgcs.add("x10-java-opt"); // read data BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line = in.readLine(); while (line!=null) { new Entry(line); line = in.readLine(); } // section heading out.println("------- PERFORMANCE DATA:"); out.println(); // column headers out.printf("%20s", ""); for (String lgc : lgcs) out.printf("%-15s", lgc); out.printf("\n"); out.println(); // identifying letter String letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; int letterCount = 0; char letter = letters.charAt(letterCount++); // for each row for (String test : tests) { // row header out.printf("%-20s", test); // keep track of dates for this row Set<String> dates = new LinkedHashSet<String>(); // for each column for (String lgc : lgcs) { // find shown (last) and prev (next to last) Collection<Entry> l = entries.get(test, lgc); Entry show = null; Entry prev = null; if (l!=null) { for (Entry e : l) { show = e; prev = e; } } // look for significant changes from prev to shown if (prev!=null && show!=null) { double ratio = show.ops() / prev.ops(); if (ratio>1.1 || ratio <0.9) changed.printf(" %-20s %-14s %.2fx from %s to %s\n", show.get("test"), lgc, ratio, prev.get("date-time"), show.get("date-time")); } // show a row/column entry if (show!=null) { double ops = show.ops(); entries.putShown(show); dates.add(show.get("date")); if (ops<1e6) out.printf("%c: %-4.3g kop/s ", letter, ops/1e3); else if (ops<1e9) out.printf("%c: %-4.3g Mop/s ", letter, ops/1e6); else out.printf("%c: %-4.3g Gop/s ", letter, ops/1e9); show.letter = letter; letter = letters.charAt(letterCount++); } else out.printf("%15s", ""); } // show dates for this row for (String d : dates) out.printf("%s ", d); // done with row out.printf("\n"); } out.println(); out.println("------- COMPARISONS:"); out.println(); out.println("C++ back end relative to hand-coded"); compare(" rail access", "SeqRail2", "x10-cpp-opt", "SeqRail2", "cpp-opt"); compare(" non-generic pseudo-array", "SeqPseudoArray2a","x10-cpp-opt", "SeqPseudoArray2a","cpp-opt"); compare(" generic pseudo-array", "SeqPseudoArray2b","x10-cpp-opt", "SeqPseudoArray2a","cpp-opt"); compare(" array w/ c-style loop", "SeqArray2a", "x10-cpp-opt", "SeqPseudoArray2a","cpp-opt"); //compare(" array w/ x10-style loop", "SeqArray2b", "x10-cpp-opt", "SeqPseudoArray2a","cpp-opt"); compare(" sequential UTS", "SeqUTSBin1", "x10-cpp-opt", "SeqUTSBin1", "cpp-opt"); compare(" matrix multiply", "SeqMatMultAdd1a", "x10-cpp-opt", "SeqMatMultAdd1a", "cpp-opt"); compare(" sequential frag. stream", "SeqStream1", "x10-cpp-opt", "SeqStream1", "cpp-opt"); compare(" sequential random access", "SeqRandomAccess1","x10-cpp-opt", "SeqRandomAccess1","cpp-opt"); out.println(); out.println("Java back end relative to hand-coded"); compare(" rail access", "SeqRail2", "x10-java-opt", "SeqRail2", "java-opt"); compare(" non-generic pseudo-array", "SeqPseudoArray2a","x10-java-opt", "SeqPseudoArray2a","java-opt"); compare(" generic pseudo-array", "SeqPseudoArray2b","x10-java-opt", "SeqPseudoArray2a","java-opt"); compare(" array w/ c-style loop", "SeqArray2a", "x10-java-opt", "SeqPseudoArray2a","java-opt"); compare(" array w/ x10-style loop", "SeqArray2b", "x10-java-opt", "SeqPseudoArray2a","java-opt"); compare(" sequential UTS", "SeqUTSBin1", "x10-java-opt", "SeqUTSBin1", "java-opt"); compare(" matrix multiply", "SeqMatMultAdd1a", "x10-java-opt", "SeqMatMultAdd1a", "java-opt"); compare(" sequential frag. stream", "SeqStream1", "x10-java-opt", "SeqStream1", "java-opt"); compare(" sequential random access", "SeqRandomAccess1","x10-java-opt", "SeqRandomAccess1","java-opt"); out.println(); out.println("C++ back end relative to Java back end"); compare(" rail access", "SeqRail2", "x10-cpp-opt", "SeqRail2", "x10-java-opt"); compare(" non-generic pseudo-array", "SeqPseudoArray2a","x10-cpp-opt", "SeqPseudoArray2a","x10-java-opt"); compare(" generic pseudo-array", "SeqPseudoArray2b","x10-cpp-opt", "SeqPseudoArray2b","x10-java-opt"); compare(" array w/ c-style loop", "SeqArray2a", "x10-cpp-opt", "SeqArray2a", "x10-java-opt"); //compare(" array w/ x10-style loop", "SeqArray2b", "x10-cpp-opt", "SeqArray2a", "x10-java-opt"); compare(" sequential UTS", "SeqUTSBin1", "x10-cpp-opt", "SeqUTSBin1", "x10-java-opt"); compare(" matrix multiply", "SeqMatMultAdd1a", "x10-cpp-opt", "SeqMatMultAdd1a", "x10-java-opt"); compare(" sequential frag. stream", "SeqStream1", "x10-cpp-opt", "SeqStream1", "x10-java-opt"); compare(" sequential random access", "SeqRandomAccess1","x10-cpp-opt", "SeqRandomAccess1","x10-java-opt"); out.println(); compare("C++ generic vs non-generic", "SeqPseudoArray2b","x10-cpp-opt", "SeqPseudoArray2a","x10-cpp-opt"); //compare("Java generic vs non-generic", "SeqPseudoArray2b","x10-java-opt", "SeqPseudoArray2a","x10-java-opt"); out.println(); compare("UTS par. speedup (Java)", "ParUTSBin1","x10-java-opt", "SeqUTSBin1","x10-java-opt"); out.println(); compare("Stream par. speedup (Java)", "ParStream1", "x10-java-opt", "SeqStream1", "x10-java-opt"); compare("Stream par. speedup (C++)", "ParStream1", "x10-cpp-opt", "SeqStream1", "x10-cpp-opt"); out.println(); compare("Stream dist. speedup (Java)", "DistStream1", "x10-java-opt", "SeqStream1", "x10-java-opt"); compare("Stream dist. speedup (C++)", "DistStream1", "x10-cpp-opt", "SeqStream1", "x10-cpp-opt"); out.println(); compare("Rand. access par. speedup (Java)", "ParRandomAccess1", "x10-java-opt", "SeqRandomAccess1", "x10-java-opt"); compare("Rand. access par. speedup (C++)", "ParRandomAccess1", "x10-cpp-opt", "SeqRandomAccess1", "x10-cpp-opt"); out.println(); compare("Rand. access dist. speedup (Java)", "DistRandomAccess1", "x10-java-opt", "SeqRandomAccess1", "x10-java-opt"); compare("Rand. access dist. speedup (C++)", "DistRandomAccess1", "x10-cpp-opt", "SeqRandomAccess1", "x10-cpp-opt"); out.println(); String s = changes.toString(); if (s.length()>0) out.println("significant changes:\n" + s); } static void compare(String name, String t1, String l1, String t2, String l2) { Entry e1 = entries.getShown(t1,l1); Entry e2 = entries.getShown(t2,l2); if (e2.ops()>e1.ops()) out.printf("%-30s %5.1fx slower (%s/%s)\n", name, e2.ops()/e1.ops(), e2.letter, e1.letter); else out.printf("%-30s %5.1fx faster (%s/%s)\n", name, e1.ops()/e2.ops(), e1.letter, e2.letter); } }