src/Pure/Tools/profiling_report.scala
author wenzelm
Mon Oct 09 21:12:22 2017 +0200 (21 months ago)
changeset 66822 4642cf4a7ebb
parent 64342 53fb4a19fb98
permissions -rw-r--r--
tuned signature;
     1 /*  Title:      Pure/Tools/profiling_report.scala
     2     Author:     Makarius
     3 
     4 Report Poly/ML profiling information from log files.
     5 */
     6 
     7 package isabelle
     8 
     9 
    10 import java.util.Locale
    11 
    12 
    13 object Profiling_Report
    14 {
    15   def profiling_report(log_file: Build_Log.Log_File): List[(Long, String)] =
    16   {
    17     val Line = """^(?:### )?([ 0-9]{10}) (\S+|GARBAGE COLLECTION.*)$""".r
    18     val Count = """ *(\d+)""".r
    19     val clean = """-?\(\d+\).*$""".r
    20 
    21     var results = Map.empty[String, Long]
    22     for (Line(Count(Value.Long(count)), raw_fun) <- log_file.lines) {
    23       val fun = clean.replaceAllIn(raw_fun, "")
    24       results += (fun -> (results.getOrElse(fun, 0L) + count))
    25     }
    26     for ((fun, count) <- results.toList.sortBy(_._2)) yield (count, fun)
    27   }
    28 
    29 
    30   /* Isabelle tool wrapper */
    31 
    32   val isabelle_tool =
    33     Isabelle_Tool("profiling_report", "report Poly/ML profiling information from log files", args =>
    34     {
    35       Command_Line.tool0 {
    36         val getopts =
    37           Getopts("""
    38 Usage: isabelle profiling_report [LOGS ...]
    39 
    40   Report Poly/ML profiling output from log files (potentially compressed).
    41 """)
    42         val log_names = getopts(args)
    43         for (name <- log_names) {
    44           val log_file = Build_Log.Log_File(Path.explode(name))
    45           val results =
    46             for ((count, fun) <- profiling_report(log_file))
    47               yield
    48                 String.format(Locale.ROOT, "%14d %s",
    49                   count.asInstanceOf[AnyRef], fun.asInstanceOf[AnyRef])
    50           if (results.nonEmpty)
    51             Output.writeln(cat_lines((log_file.name + ":") :: results))
    52         }
    53       }
    54     })
    55 }