Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 import 'dart:async'; | |
|
ahe
2017/03/07 14:04:02
Missing copyright.
danrubel
2017/03/09 02:01:01
Fixed. https://codereview.chromium.org/2739963002
| |
| 2 import 'dart:convert'; | |
| 3 import 'dart:math'; | |
| 4 import 'dart:io'; | |
| 5 | |
| 6 import 'standard_deviation.dart'; | |
| 7 | |
| 8 const String bRootPath = const String.fromEnvironment("bRoot"); | |
| 9 const int iterations = const int.fromEnvironment("iterations", defaultValue: 1); | |
| 10 | |
| 11 /// Compare the performance of two different fast implementations | |
| 12 /// by alternately launching the compile application in this directory | |
| 13 /// and the compile application location in the repo specified by "bRoot" | |
| 14 /// via -DbRoot=/absolute/path/to/other/sdk/repo | |
| 15 main(List<String> args) async { | |
| 16 print(args); | |
| 17 if (bRootPath == null) { | |
| 18 print('Expected -DbRoot=/absolute/path/to/other/sdk/repo'); | |
| 19 exit(1); | |
| 20 } | |
| 21 | |
| 22 // The root of this Dart SDK repo "A" | |
| 23 Uri aRoot = Platform.script.resolve('../../../..'); | |
| 24 | |
| 25 // The root of the other Dart SDK repo "B" | |
| 26 Uri bRoot = new Uri.directory(bRootPath); | |
| 27 | |
| 28 // Sanity check | |
| 29 String relPath = 'pkg/front_end/tool/fasta/compile.dart'; | |
| 30 Uri aCompile = aRoot.resolve(relPath); | |
| 31 if (!new File(aCompile.toFilePath()).existsSync()) { | |
| 32 print('Failed to find $aCompile'); | |
| 33 exit(1); | |
| 34 } | |
| 35 Uri bCompile = bRoot.resolve(relPath); | |
| 36 if (!new File(bCompile.toFilePath()).existsSync()) { | |
| 37 print('Failed to find $bCompile'); | |
| 38 exit(1); | |
| 39 } | |
| 40 | |
| 41 print('Comparing:'); | |
| 42 print('A: $aCompile'); | |
| 43 print('B: $bCompile'); | |
| 44 print(''); | |
| 45 | |
| 46 List<double> aCold = <double>[]; | |
| 47 List<double> aWarm = <double>[]; | |
| 48 List<double> bCold = <double>[]; | |
| 49 List<double> bWarm = <double>[]; | |
| 50 for (int count = 0; count < 15; ++count) { | |
| 51 await run(aRoot, aCompile, args, aCold, aWarm); | |
| 52 await run(bRoot, bCompile, args, bCold, bWarm); | |
| 53 } | |
| 54 | |
| 55 print(''); | |
| 56 print('Raw data:'); | |
| 57 print('A cold, A warm, B cold, B warm'); | |
| 58 for (int index = 0; index < aCold.length; ++index) { | |
| 59 print('${aCold[index]}, ${aWarm[index]}, ${bCold[index]}, ${bWarm[index]}'); | |
| 60 } | |
| 61 | |
| 62 double aColdMean = average(aCold); | |
| 63 double aWarmMean = average(aWarm); | |
| 64 double bColdMean = average(bCold); | |
| 65 double bWarmMean = average(bWarm); | |
| 66 | |
| 67 print(''); | |
| 68 print('Average:'); | |
| 69 print('$aColdMean, $aWarmMean, $bColdMean, $bWarmMean'); | |
| 70 | |
| 71 double aColdStdDev = standardDeviation(aColdMean, aCold); | |
| 72 double aWarmStdDev = standardDeviation(aWarmMean, aWarm); | |
| 73 double bColdStdDev = standardDeviation(bColdMean, bCold); | |
| 74 double bWarmStdDev = standardDeviation(bWarmMean, bWarm); | |
| 75 | |
| 76 double aColdStdDevMean = standardDeviationOfTheMean(aCold, aColdStdDev); | |
| 77 double aWarmStdDevMean = standardDeviationOfTheMean(aWarm, aWarmStdDev); | |
| 78 double bColdStdDevMean = standardDeviationOfTheMean(bCold, bColdStdDev); | |
| 79 double bWarmStdDevMean = standardDeviationOfTheMean(bWarm, bWarmStdDev); | |
| 80 | |
| 81 print(''); | |
| 82 print('Uncertainty:'); | |
| 83 print( | |
| 84 '$aColdStdDevMean, $aWarmStdDevMean, $bColdStdDevMean, $bWarmStdDevMean'); | |
| 85 | |
| 86 double coldDelta = aColdMean - bColdMean; | |
| 87 double coldStdDevMean = | |
| 88 sqrt(pow(aColdStdDevMean, 2) + pow(bColdStdDevMean, 2)); | |
| 89 double warmDelta = aWarmMean - bWarmMean; | |
| 90 double warmStdDevMean = | |
| 91 sqrt(pow(aWarmStdDevMean, 2) + pow(bWarmStdDevMean, 2)); | |
| 92 | |
| 93 print(''); | |
| 94 print('Summary:'); | |
| 95 print(' A cold start - B cold start : $coldDelta'); | |
| 96 print(' Uncertainty : $coldStdDevMean'); | |
| 97 print(''); | |
| 98 print(' A warm runs - B warm runs : $warmDelta'); | |
| 99 print(' Uncertainty : $warmStdDevMean'); | |
| 100 } | |
| 101 | |
| 102 const String _wroteProgram = 'Wrote program to'; | |
| 103 const String _coldStart = 'Cold start (first run):'; | |
| 104 const String _warmRun = 'Warm run average (runs #4'; | |
| 105 | |
| 106 /// Launch the specified dart program, forwarding all arguments and environment | |
| 107 /// that was passed to this program | |
| 108 Future<Null> run(Uri workingDir, Uri dartApp, List<String> args, | |
| 109 List<double> cold, List<double> warm) async { | |
| 110 print('Running $dartApp'); | |
| 111 | |
| 112 void processLine(String line) { | |
| 113 if (line.contains(_wroteProgram)) { | |
| 114 // Show progress | |
| 115 stdout | |
| 116 ..write('.') | |
| 117 ..flush(); | |
| 118 return; | |
| 119 } | |
| 120 int index = line.indexOf(_coldStart); | |
| 121 if (index >= 0) { | |
| 122 cold.add(double.parse(line.substring(index + _coldStart.length))); | |
| 123 print('\ncold: ${cold.last}'); | |
| 124 return; | |
| 125 } | |
| 126 index = line.indexOf(_warmRun); | |
| 127 if (index >= 0) { | |
| 128 index = line.indexOf(':', index + _warmRun.length); | |
| 129 warm.add(double.parse(line.substring(index + 1))); | |
| 130 print('warm: ${warm.last}'); | |
| 131 return; | |
| 132 } | |
| 133 } | |
| 134 | |
| 135 String workingDirPath = workingDir.toFilePath(); | |
| 136 List<String> procArgs = <String>[ | |
| 137 '-Diterations=$iterations', | |
| 138 dartApp.toFilePath() | |
| 139 ]; | |
| 140 procArgs.addAll(args); | |
| 141 | |
| 142 Process process = await Process.start(Platform.executable, procArgs, | |
| 143 workingDirectory: workingDirPath); | |
| 144 stderr.addStream(process.stderr); | |
| 145 StreamSubscription<String> stdOutSubscription; | |
| 146 stdOutSubscription = process.stdout | |
| 147 .transform(UTF8.decoder) | |
| 148 .transform(new LineSplitter()) | |
| 149 .listen(processLine, onDone: () { | |
| 150 stdOutSubscription.cancel(); | |
| 151 }, onError: (e) { | |
| 152 print('Error: $e'); | |
| 153 stdOutSubscription.cancel(); | |
| 154 }); | |
| 155 int code = await process.exitCode; | |
| 156 if (code != 0) { | |
| 157 throw 'fail: $code'; | |
| 158 } | |
| 159 print(''); | |
| 160 } | |
| OLD | NEW |