Skip to content

Instantly share code, notes, and snippets.

@lahma
Created January 10, 2018 21:16
Show Gist options
  • Save lahma/64f9123cd8ac25a9016c46edfb696f63 to your computer and use it in GitHub Desktop.
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
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