src/Pure/Tools/profiling_report.scala
author wenzelm
Thu, 22 Nov 2018 17:34:37 +0100
changeset 69328 4646fcb59121
parent 64342 53fb4a19fb98
child 71632 c1bc38327bc2
permissions -rw-r--r--
support for fontforge and its scripting language;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64342
53fb4a19fb98 regular user tool;
wenzelm
parents: 64311
diff changeset
     1
/*  Title:      Pure/Tools/profiling_report.scala
64311
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     3
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     4
Report Poly/ML profiling information from log files.
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     5
*/
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     6
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     7
package isabelle
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     8
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
     9
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    10
import java.util.Locale
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    11
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    12
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    13
object Profiling_Report
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    14
{
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    15
  def profiling_report(log_file: Build_Log.Log_File): List[(Long, String)] =
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    16
  {
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    17
    val Line = """^(?:### )?([ 0-9]{10}) (\S+|GARBAGE COLLECTION.*)$""".r
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    18
    val Count = """ *(\d+)""".r
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    19
    val clean = """-?\(\d+\).*$""".r
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    20
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    21
    var results = Map.empty[String, Long]
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    22
    for (Line(Count(Value.Long(count)), raw_fun) <- log_file.lines) {
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    23
      val fun = clean.replaceAllIn(raw_fun, "")
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    24
      results += (fun -> (results.getOrElse(fun, 0L) + count))
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    25
    }
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    26
    for ((fun, count) <- results.toList.sortBy(_._2)) yield (count, fun)
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    27
  }
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    28
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    29
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    30
  /* Isabelle tool wrapper */
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    31
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    32
  val isabelle_tool =
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    33
    Isabelle_Tool("profiling_report", "report Poly/ML profiling information from log files", args =>
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    34
    {
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    35
      Command_Line.tool0 {
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    36
        val getopts =
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    37
          Getopts("""
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    38
Usage: isabelle profiling_report [LOGS ...]
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    39
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    40
  Report Poly/ML profiling output from log files (potentially compressed).
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    41
""")
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    42
        val log_names = getopts(args)
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    43
        for (name <- log_names) {
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    44
          val log_file = Build_Log.Log_File(Path.explode(name))
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    45
          val results =
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    46
            for ((count, fun) <- profiling_report(log_file))
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    47
              yield
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    48
                String.format(Locale.ROOT, "%14d %s",
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    49
                  count.asInstanceOf[AnyRef], fun.asInstanceOf[AnyRef])
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    50
          if (results.nonEmpty)
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    51
            Output.writeln(cat_lines((log_file.name + ":") :: results))
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    52
        }
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    53
      }
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    54
    })
3d5e7719e878 proper isabelle tool in Scala;
wenzelm
parents:
diff changeset
    55
}