benchcomp: Add a mode for analyzing rule execution time in ninja log files.

llvm-svn: 265860
GitOrigin-RevId: b24f4fb6171eaf2caa8f3cf6adcf11821ec1d27c
diff --git a/utils/benchcomp/main.go b/utils/benchcomp/main.go
index 94acafc..a050f7b 100644
--- a/utils/benchcomp/main.go
+++ b/utils/benchcomp/main.go
@@ -110,6 +110,34 @@
 	return m
 }
 
+func ninja_logs(path string) map[string]float64 {
+	m := make(map[string]float64)
+
+	fh, err := os.Open(path)
+	if err != nil {
+		panic(err.Error())
+	}
+
+	scanner := bufio.NewScanner(fh)
+	for scanner.Scan() {
+		elems := strings.Split(scanner.Text(), "\t")
+		if len(elems) < 4 {
+			continue
+		}
+		begin, err := strconv.ParseInt(elems[0], 10, 64)
+		if err != nil {
+			continue
+		}
+		end, err := strconv.ParseInt(elems[1], 10, 64)
+		if err != nil {
+			panic(err.Error())
+		}
+		m[elems[3]] = float64(end-begin)
+	}
+
+	return m
+}
+
 func main() {
 	var cmp func(string) map[string]float64
 	switch os.Args[1] {
@@ -128,6 +156,9 @@
 		cmp = func(path string) map[string]float64 {
 			return benchnums(path, "allocs/op")
 		}
+
+	case "ninja_logs":
+		cmp = ninja_logs
 	}
 
 	syms1 := cmp(os.Args[2])