Created
January 10, 2018 21:16
-
-
Save lahma/64f9123cd8ac25a9016c46edfb696f63 to your computer and use it in GitHub Desktop.
Quick and dirty program to calcualte result differences from two directories and show percentages
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Globalization; | |
using System.IO; | |
using System.Linq; | |
namespace ConsoleApp1 | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
if (args.Length != 2) | |
{ | |
Console.Error.WriteLine("syntax: <old result path> <new result path>"); | |
} | |
var oldDir = new DirectoryInfo(args[0]); | |
if (!oldDir.Exists) | |
{ | |
Console.Error.WriteLine("old directory does not exist"); | |
} | |
var newDir = new DirectoryInfo(args[1]); | |
if (!newDir.Exists) | |
{ | |
Console.Error.WriteLine("new directory does not exist"); | |
} | |
var pairs = new List<(FileInfo OldFile, FileInfo NewFile)>(); | |
foreach (var oldReportFile in oldDir.GetFiles("*-report.csv")) | |
{ | |
var fileName = oldReportFile.Name; | |
var newReportFile = new FileInfo(Path.Combine(newDir.FullName, fileName)); | |
if (newReportFile.Exists) | |
{ | |
pairs.Add((oldReportFile, newReportFile)); | |
} | |
} | |
var columns = new List<string> | |
{ | |
"Method", | |
"FileName", | |
"N", | |
"Mean", | |
"Gen 0", | |
"Gen 1", | |
"Gen 2", | |
"Allocated" | |
}; | |
var targetFile = Path.Combine(@"C:\temp\diff\", "analysis-github-diff.md"); | |
using (var writer = new StreamWriter(targetFile)) | |
{ | |
foreach (var pair in pairs) | |
{ | |
writer.WriteLine("## " + pair.OldFile.Name.Replace("-report.csv", "")); | |
writer.WriteLine(); | |
Console.WriteLine("Analyzing pair " + pair.OldFile.Name); | |
using (var oldReader = new StreamReader(pair.OldFile.FullName)) | |
using (var newReader = new StreamReader(pair.NewFile.FullName)) | |
{ | |
ReadLinePair(oldReader, newReader, out var headers); | |
var oldHeaders = headers.Old.Split(";").Select((x, i) => (x, i)).ToDictionary(x => x.Item1, x => x.Item2); | |
var newHeaders = headers.New.Split(";").Select((x, i) => (x, i)).ToDictionary(x => x.Item1, x => x.Item2); | |
var readLines = new List<(string Old, string New)>(); | |
while (ReadLinePair(oldReader, newReader, out var lines)) | |
{ | |
if (string.IsNullOrEmpty(lines.Old)) | |
{ | |
break; | |
} | |
readLines.Add(lines); | |
} | |
var effectiveHeaders = columns | |
.Where(x => oldHeaders.ContainsKey(x) && newHeaders.ContainsKey(x)) | |
.ToList(); | |
writer.WriteLine("| **Diff**|" + string.Join("|", effectiveHeaders) + "|"); | |
writer.Write("|------- "); | |
foreach (var effectiveHeader in effectiveHeaders) | |
{ | |
writer.Write("|-------"); | |
if (effectiveHeader.IndexOf("Gen ") > -1 || effectiveHeader == "Allocated" || effectiveHeader == "Mean") | |
{ | |
writer.Write(":"); | |
} | |
} | |
writer.WriteLine("|"); | |
foreach (var lines in readLines) | |
{ | |
if (string.IsNullOrEmpty(lines.Old)) | |
{ | |
break; | |
} | |
var oldie = lines.Old.Split(";"); | |
var newbie = lines.New.Split(";"); | |
var oldColumnValues = new Dictionary<string, string>(); | |
writer.Write("| Old |"); | |
foreach (var effectiveHeader in effectiveHeaders) | |
{ | |
var value = oldie[oldHeaders[effectiveHeader]].TrimStart('"').TrimEnd('"'); | |
oldColumnValues[effectiveHeader] = value; | |
writer.Write(value + "|"); | |
} | |
writer.WriteLine(); | |
writer.Write("| **New** |"); | |
foreach (var effectiveHeader in effectiveHeaders) | |
{ | |
if (effectiveHeader == "Method" || effectiveHeader == "N" || effectiveHeader == "FileName") | |
{ | |
writer.Write("\t|"); | |
} | |
else | |
{ | |
var value = newbie[newHeaders[effectiveHeader]].TrimStart('"').TrimEnd('"'); | |
if (oldColumnValues.TryGetValue(effectiveHeader, out var oldString)) | |
{ | |
var oldTokens = oldString.Split(" "); | |
var newTokens = value.Split(" "); | |
if (oldTokens.Length == newTokens.Length) | |
{ | |
bool ok = (oldTokens.Length == 1 || oldTokens[1] == newTokens[1]) | |
&& oldTokens[0] != "-" && newTokens[0] != "-"; | |
if (ok) | |
{ | |
var old = decimal.Parse(oldTokens[0], CultureInfo.InvariantCulture); | |
var newValue = decimal.Parse(newTokens[0], CultureInfo.InvariantCulture); | |
var diff = (newValue / old - 1) * 100; | |
value += $" ({diff:+#;-#;0}%)"; | |
} | |
else if (oldTokens[0] == "-" || newTokens[0] == "-") | |
{ | |
// OK | |
} | |
else | |
{ | |
Console.Error.WriteLine("Cannot calculate difff for " + oldString + " vs " + value); | |
} | |
} | |
} | |
writer.Write(" **" + value + "** |"); | |
} | |
} | |
writer.WriteLine(); | |
} | |
} | |
writer.WriteLine(); | |
writer.WriteLine(); | |
} | |
Console.WriteLine("Wrote results to " + targetFile); | |
} | |
} | |
private static bool ReadLinePair( | |
TextReader oldReader, | |
TextReader newReader, | |
out (string Old, string New) pair) | |
{ | |
string oldLine; | |
string newLine; | |
var ok = (oldLine = oldReader.ReadLine()) != null; | |
ok &= (newLine = newReader.ReadLine()) != null; | |
pair = (oldLine, newLine); | |
return ok; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment