src/Pure/Admin/profiling_report.scala
changeset 64311 3d5e7719e878
equal deleted inserted replaced
64310:3584841f2d2c 64311:3d5e7719e878
       
     1 /*  Title:      Pure/Admin/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 }