Home | History | Annotate | Download | only in scripts
      1 <!DOCTYPE html>
      2 
      3 <script>
      4 'use strict';
      5 
      6 const RENDER_THREAD_NAME = "RenderThread";
      7 const UI_THREAD_NAME = "UI Thread";
      8 const DRAW_FRAME_SLICE_TITLE = "DrawFrame";
      9 const BINDER_SLICE_TITLE = "binder transaction";
     10 const RECORD_SLICE_TITLE = "Record View#draw()";
     11 const DEQUEUE_BUFFER_SLICE_TITLE = "dequeueBuffer";
     12 
     13 function getTimeInBinder(slice) {
     14     if (slice.title === BINDER_SLICE_TITLE) {
     15         return slice.duration;
     16     }
     17     let result = 0.0;
     18     for (let subslice of slice.subSlices) {
     19         result += getTimeInBinder(subslice);
     20     }
     21     return result;
     22 }
     23 
     24 function getTimeInDequeueBuffer(slice) {
     25     if (slice.title === DEQUEUE_BUFFER_SLICE_TITLE) {
     26         return slice.duration;
     27     }
     28     let result = 0.0;
     29     for (let subslice of slice.subSlices) {
     30         result += getTimeInDequeueBuffer(subslice);
     31     }
     32     return result;
     33 }
     34 
     35 tr.mre.FunctionRegistry.register(
     36     function AvgDrawFrame(result, model) {
     37         let canonicalUrl = model.canonicalUrl;
     38 
     39         for (let p of model.getAllProcesses()) {
     40             //calc stats for processes that have UI and render threads and at least 10 frames
     41             let renderThread = p.findAtMostOneThreadNamed(RENDER_THREAD_NAME);
     42             let UIThread = p.findAtMostOneThreadNamed(UI_THREAD_NAME);
     43             if (renderThread && UIThread)
     44             {
     45                 let numDrawFrames = 0;
     46                 let drawFramesWallDuration = 0.0;
     47                 let binderDuration = 0.0;
     48                 let dequeueBufferDuration = 0.0;
     49 
     50                 let numRecordViewDraw = 0;
     51                 let recordViewDrawWallDuration = 0.0;
     52 
     53                 renderThread.sliceGroup.slices.forEach(function(slice) {
     54                     if (slice.title === DRAW_FRAME_SLICE_TITLE) {
     55                         drawFramesWallDuration += slice.duration;
     56                         numDrawFrames++;
     57                         binderDuration += getTimeInBinder(slice);
     58                         dequeueBufferDuration += getTimeInDequeueBuffer(slice);
     59                     }
     60                 });
     61                 if (numDrawFrames < 10) continue;
     62                 UIThread.sliceGroup.slices.forEach(function(slice) {
     63                     if (slice.title === RECORD_SLICE_TITLE) {
     64                         recordViewDrawWallDuration += slice.duration;
     65                         numRecordViewDraw++;
     66                     }
     67                 });
     68 
     69                 let avgDrawFrameDuration = undefined;
     70                 if (numDrawFrames > 0) {
     71                     avgDrawFrameDuration = (drawFramesWallDuration-dequeueBufferDuration)/numDrawFrames;
     72                 }
     73                 let avgRecordViewDrawDuration = undefined;
     74                 if (numRecordViewDraw > 0) {
     75                     avgRecordViewDrawDuration = recordViewDrawWallDuration/numRecordViewDraw;
     76                 }
     77 
     78                 result.addPair('result', {
     79                     canonicalUrl: canonicalUrl,
     80                     processName: p.name,
     81                     avgDrawFrameDuration: Number(avgDrawFrameDuration).toFixed(3),
     82                     avgRecordViewDrawDuration: Number(avgRecordViewDrawDuration).toFixed(3),
     83                     avgRecordAndPlay: Number(avgDrawFrameDuration+avgRecordViewDrawDuration).toFixed(3)
     84                 });
     85             }
     86         }
     87     });
     88 
     89 </script>
     90