src/Pure/Tools/build_schedule.scala
changeset 78934 5553a86a1091
parent 78933 4f940d7293ea
child 78968 faa5af35fb65
equal deleted inserted replaced
78933:4f940d7293ea 78934:5553a86a1091
   124 
   124 
   125   object Timing_Data {
   125   object Timing_Data {
   126     def median_time(obs: List[Time]): Time = obs.sortBy(_.ms).drop(obs.length / 2).head
   126     def median_time(obs: List[Time]): Time = obs.sortBy(_.ms).drop(obs.length / 2).head
   127     def mean_time(obs: Iterable[Time]): Time = Time.ms(obs.map(_.ms).sum / obs.size)
   127     def mean_time(obs: Iterable[Time]): Time = Time.ms(obs.map(_.ms).sum / obs.size)
   128 
   128 
   129     private val dummy_entries =
   129     private def dummy_entries(host: Host, host_factor: Double) =
   130       List(
   130       List(
   131         Timing_Entry("dummy", "dummy", 1, Time.minutes(5)),
   131         Timing_Entry("dummy", host.info.hostname, 1, Time.minutes(5).scale(host_factor)),
   132         Timing_Entry("dummy", "dummy", 8, Time.minutes(1)))
   132         Timing_Entry("dummy", host.info.hostname, 8, Time.minutes(1).scale(host_factor)))
   133 
       
   134     def dummy: Timing_Data = new Timing_Data(dummy_entries, Host_Infos.dummy)
       
   135 
   133 
   136     def make(
   134     def make(
   137       host_infos: Host_Infos,
   135       host_infos: Host_Infos,
   138       build_history: List[(Build_Log.Meta_Info, Build_Log.Build_Info)],
   136       build_history: List[(Build_Log.Meta_Info, Build_Log.Build_Info)],
   139     ): Timing_Data = {
   137     ): Timing_Data = {
   148           host <- hosts.find(_.info.hostname == build_host).toList
   146           host <- hosts.find(_.info.hostname == build_host).toList
   149           threads = session_info.threads.getOrElse(host.info.num_cpus)
   147           threads = session_info.threads.getOrElse(host.info.num_cpus)
   150         } yield (job_name, hostname, threads) -> session_info.timing.elapsed
   148         } yield (job_name, hostname, threads) -> session_info.timing.elapsed
   151 
   149 
   152       val entries =
   150       val entries =
   153         if (measurements.isEmpty) dummy_entries
   151         if (measurements.isEmpty) {
       
   152           val default_host = host_infos.hosts.sorted(host_infos.host_speeds).head
       
   153           host_infos.hosts.flatMap(host =>
       
   154             dummy_entries(host, host_infos.host_factor(default_host, host)))
       
   155         }
   154         else
   156         else
   155           measurements.groupMap(_._1)(_._2).toList.map {
   157           measurements.groupMap(_._1)(_._2).toList.map {
   156             case ((job_name, hostname, threads), timings) =>
   158             case ((job_name, hostname, threads), timings) =>
   157               Timing_Entry(job_name, hostname, threads, median_time(timings))
   159               Timing_Entry(job_name, hostname, threads, median_time(timings))
   158           }
   160           }