<script id=“profilerTemplate” type=“text/x-dot-tmpl”>
<div class="profiler-result"> <div class="profiler-button {{? it.has_duplicate_sql_timings}}profiler-warning{{?}}"> {{? it.has_duplicate_sql_timings}}<span class="profiler-nuclear">!</span>{{?}} <span class="profiler-number profiler-duration-milliseconds"> {{= MiniProfiler.formatDuration(it.duration_milliseconds)}} <span class="profiler-unit">ms</span> </span> {{? MiniProfiler.showTotalSqlCount()}} <span class="profiler-number profiler-sql-count"> {{= it.sql_count}} <span class="profiler-unit">sql</span> </span> {{?}} <span class="profiler-name"> {{? it.name.length >= 30 }} {{= it.name.substring(0,15) + "..." + it.name.slice(-15) }} {{??}} {{= it.name}} {{?}} </span> </div> <div class="profiler-popup"> <div class="profiler-info"> <span class="profiler-name" title="{{= it.name}}"> {{= it.name }} <span class="profiler-overall-duration">({{= MiniProfiler.formatDuration(it.duration_milliseconds)}} ms)</span> </span> <span class="profiler-server-time">{{= it.machine_name}} on {{= MiniProfiler.renderDate(it.started_formatted)}}</span> </div> <div class="profiler-output"> <table class="profiler-timings"> <thead> <tr> <th>event</th> <th>duration (ms)</th> <th class="profiler-duration-with-children">with children (ms)</th> <th class="time-from-start">from start (ms)</th> {{? it.has_sql_timings}} <th colspan="2">query time (ms)</th> {{?}} {{~ it.custom_timing_names :value}} <th colspan="2">{{= value.toLowerCase() }} (ms)</th> {{~}} </tr> </thead> <tbody> {{= MiniProfiler.templates.timingTemplate({timing: it.root, page: it}) }} </tbody> {{? it.has_sql_timings}} <tfoot> <tr> <td colspan="1"> SQL Summary: </td> <td colspan="5" title="percent of total request time spent in SQL"> {{=it.sql_count}} {{? it.cached_sql_count > 0 }} ({{=it.cached_sql_count}} cached) {{?}} <span class="profiler-unit" title="percent of total request time spent in SQL"> - {{= MiniProfiler.formatDuration(it.duration_milliseconds_in_sql / it.duration_milliseconds * 100) }}% in sql </span> </td> </tr> </tfoot> {{?}} </table> <div class="profiler-timings-summary"> <div> {{? !it.client_timings}} {{= MiniProfiler.templates.linksTemplate({timing: it.root, page: it}) }} {{?}} <a class="profiler-toggle-duration-with-children" title="toggles column with aggregate child durations">show time with children</a> <a class="profiler-snapshots-page-link" title="Go to snapshots page" href="{{= MiniProfiler.options.path }}snapshots">snapshots</a> </div> {{~ it.custom_timing_names :value}} <div class="profiler-number profiler-percentage-in-sql" title="{{= it.custom_timing_stats[value].count }} {{= value.toLowerCase() }} invocations spent {{= MiniProfiler.formatDuration(it.custom_timing_stats[value].duration) }} ms of total request time"> {{= MiniProfiler.formatDuration(it.custom_timing_stats[value].duration / it.duration_milliseconds * 100) }} <span class="profiler-unit">% in {{= value.toLowerCase() }}</span> </div> {{~}} </div> {{? it.client_timings}} <table class="profiler-timings profiler-client-timings"> <thead> <tr> <th>client event</th> <th>duration (ms)</th> <th>from start (ms)</th> </tr> </thead> <tbody> {{~ MiniProfiler.getClientTimings(it.client_timings) :value}} <tr class="{{? value.isTrivial }}profiler-trivial{{?}}"> <td class="profiler-label">{{= value.name }}</td> <td class="profiler-duration"> {{? value.duration >= 0}} <span class="profiler-unit"></span>{{= MiniProfiler.formatDuration(value.duration) }} {{?}} </td> <td class="profiler-duration time-from-start"> <span class="profiler-unit">+</span>{{= MiniProfiler.formatDuration(value.start) }} </td> </tr> {{~}} </tbody> <tfoot> <td colspan="3"> {{= MiniProfiler.templates.linksTemplate({timing: it.root, page: it}) }} </td> </tfoot> </table> {{?}} {{? it.custom_fields && Object.keys(it.custom_fields).length > 0 }} <p class="custom-fields-title">Snapshot custom fields</p> <table class="profiler-timings"> <tbody> {{~ Object.keys(it.custom_fields) :key }} <tr> <td class="profiler-label">{{= key }}</td> <td class="profiler-label">{{= it.custom_fields[key] }}</td> </tr> {{~}} </tbody> </table> {{?}} </div> </div> {{? it.has_sql_timings}} <div class="profiler-queries"> <table> <thead> <tr> <th class="ta-right">step<br />time from start<br />query type<br />duration<br />records</th> <th class="ta-left">call stack<br />query</th> </tr> </thead> <tbody> {{~ MiniProfiler.getSqlTimings(it.root) :value:index}} {{= MiniProfiler.templates.sqlGapTemplate({g: value.prevGap}) }} {{= MiniProfiler.templates.sqlTimingTemplate({i: index, s: value}) }} {{? value.nextGap}} {{= MiniProfiler.templates.sqlGapTemplate({g: value.nextGap}) }} {{?}} {{~}} </tbody> </table> <p class="profiler-trivial-gap-container"> <a class="profiler-toggle-trivial-gaps">show trivial gaps</a> </p> </div> {{?}} </div>
</script>
<script id=“linksTemplate” type=“text/x-dot-tmpl”>
<a href="{{= MiniProfiler.shareUrl(it.page.id) }}" class="profiler-share-profiler-results" target="_blank">share</a> <a href="{{= MiniProfiler.moreUrl(it.page.name) }}" class="profiler-more-actions">more</a> {{? it.page.has_flamegraph}} <a href="{{= MiniProfiler.flamegraphUrl(it.page.id) }}" class="profiler-show-flamegraph" target="_blank">flamegraph</a> {{?}} {{? it.custom_link}} <a href="{{= it.custom_link }}" class="profiler-custom-link" target="_blank">{{= it.custom_link_name }}</a> {{?}} {{? it.page.has_trivial_timings}} <a class="profiler-toggle-trivial" data-show-on-load="{{= it.page.has_all_trivial_timings }}" title="toggles any rows with < {{= it.page.trivial_duration_threshold_milliseconds }} ms"> show trivial </a> {{?}}
</script>
<script id=“timingTemplate” type=“text/x-dot-tmpl”>
<tr class="{{? it.timing.is_trivial }}profiler-trivial{{?}}" data-timing-id="{{= it.timing.id }}"> <td class="profiler-label" title="{{? it.timing.name && it.timing.name.length > 45 }}{{= it.timing.name }}{{?}}"> <span class="profiler-indent">{{= MiniProfiler.renderIndent(it.timing.depth) }}</span> {{= it.timing.name.slice(0,45) }}{{? it.timing.name && it.timing.name.length > 45 }}...{{?}} </td> <td class="profiler-duration" title="duration of this step without any children's durations"> {{= MiniProfiler.formatDuration(it.timing.duration_without_children_milliseconds) }} </td> <td class="profiler-duration profiler-duration-with-children" title="duration of this step and its children"> {{= MiniProfiler.formatDuration(it.timing.duration_milliseconds) }} </td> <td class="profiler-duration time-from-start" title="time elapsed since profiling started"> <span class="profiler-unit">+</span>{{= MiniProfiler.formatDuration(it.timing.start_milliseconds) }} </td> {{? it.timing.has_sql_timings}} <td class="profiler-duration {{? it.timing.has_duplicate_sql_timings}}profiler-warning{{?}}" title="{{? it.timing.has_duplicate_sql_timings}}duplicate queries detected - {{?}}{{? it.timing.executed_readers > 0 || it.timing.executed_scalars > 0 || it.timing.executed_non_queries > 0}}{{= it.timing.executed_readers }} reader, {{= it.timing.executed_scalars }} scalar, {{= it.timing.executed_non_queries }} non-query statements executed{{?}}"> <a class="profiler-queries-show"> {{? it.timing.has_duplicate_sql_timings}}<span class="profiler-nuclear">!</span>{{?}} {{= it.timing.sql_timings.length }} <span class="profiler-unit">sql</span> </a> </td> <td class="profiler-duration" title="aggregate duration of all queries in this step (excludes children)"> {{= MiniProfiler.formatDuration(it.timing.sql_timings_duration_milliseconds) }} </td> {{??}} <td colspan="2"></td> {{?}} {{~ it.page.custom_timing_names :value}} {{? it.timing.custom_timings && it.timing.custom_timings[value]}} <td class="profiler-duration" title="aggregate number of all {{= value.toLowerCase() }} invocations in this step (excludes children)"> {{= it.timing.custom_timings[value].length }} {{= value.toLowerCase() }} </td> <td class="profiler-duration" title="aggregate duration of all {{= value.toLowerCase() }} invocations in this step (excludes children)"> {{= MiniProfiler.formatDuration(it.timing.custom_timing_stats[value].duration) }} </td> {{??}} <td colspan="2"></td> {{?}} {{~}} </tr> {{? it.timing.has_children}} {{~ it.timing.children :value}} {{= MiniProfiler.templates.timingTemplate({timing: value, page: it.page}) }} {{~}} {{?}}
</script>
<script id=“sqlTimingTemplate” type=“text/x-dot-tmpl”>
<tr class="{{= it.s.row_class || '' }}" data-timing-id="{{= it.s.parent_timing_id }}"> <td class="profiler-info"> <div>{{= it.s.parent_timing_name }}</div> <div class="profiler-number"><span class="profiler-unit">T+</span>{{= MiniProfiler.formatDuration(it.s.start_milliseconds) }} <span class="profiler-unit">ms</span></div> <div> {{? it.s.is_duplicate}}<span class="profiler-warning">DUPLICATE</span>{{?}} {{= MiniProfiler.renderExecuteType(it.s.execute_type) }} </div> <div title="{{? it.s.execute_type == 3}}first result fetched: {{= it.s.first_fetch_duration_milliseconds }}ms{{?}}">{{= MiniProfiler.formatDuration(it.s.duration_milliseconds) }} <span class="profiler-unit">ms</span></div> {{? it.s.row_count > 0 }} <div title="number and type of records instantiated by query">{{= it.s.class_name }}: {{= it.s.row_count }}</div> {{?}} </td> <td> <div class="query"> <pre class="profiler-stack-trace">{{= it.s.stack_trace_snippet }}</pre> {{? it.s.cached }} <span class="cached"> [CACHE] </span> {{?}} {{? it.s.formatted_command_string}} <pre class="prettyprint lang-sql"><code>{{= it.s.formatted_command_string }}; {{= MiniProfiler.formatParameters(it.s.parameters) }}</code></pre> {{??}} <i>Query redacted</i> {{?}} </div> </td> </tr>
</script>
<script id=“sqlGapTemplate” type=“text/x-dot-tmpl”>
<tr class="profiler-gap-info{{? it.g.duration < 4}} profiler-trivial-gaps{{?}}"> <td class="profiler-info"> {{= it.g.duration }} <span class="profiler-unit">ms</span> </td> <td class="query"> <div>{{= it.g.topReason.name }} — {{= it.g.topReason.duration.toFixed(2) }} <span class="profiler-unit">ms</span></div> </td> </tr>
</script>
<script id=“snapshotsGroupsList” type=“text/x-dot-tmpl”>
{{? it.list && it.list.length }} <table class="snapshots-table"> <thead> <tr> <th>Requests Group</th> <th>Worst Time (ms)</th> <th>Best Time (ms)</th> <th>No. of Snapshots</th> </tr> </thead> <tbody> {{~ it.list :row}} <tr> <td class="request-group"><a href="{{= row.url }}">{{= row.name }}</a></td> <td>{{= MiniProfiler.formatDuration(row.worst_score) }}</td> <td>{{= MiniProfiler.formatDuration(row.best_score) }}</td> <td>{{= row.snapshots_count }}</td> </tr> {{~}} </tbody> </table> {{??}} <h2>No snapshots exist</h2> {{?}}
</script>
<script id=“snapshotsList” type=“text/x-dot-tmpl”>
{{ var data = it.data; }} {{ var customFieldsNames = it.allCustomFieldsNames; }} {{? data.list && data.list.length }} <h2>Snapshots for {{= data.group_name }}</h2> <table class="snapshots-table"> <thead> <tr> <th>ID</th> <th>Duration (ms)</th> <th>SQL Count</th> {{~ customFieldsNames :name }} <th>{{= name }}</th> {{~}} <th>Age</th> </tr> </thead> <tbody> {{~ data.list :row}} <tr> <td><a href="{{= row.url }}"> {{= row.id }} </a></td> <td>{{= MiniProfiler.formatDuration(row.duration) }}</td> <td>{{= row.sql_count }}</td> {{~ customFieldsNames :name }} <td>{{= row.custom_fields[name] || "" }}</td> {{~}} <td> {{? row.timestamp }} {{= MiniProfiler.timestampToRelative(row.timestamp) }} {{?}} </td> </tr> {{~}} </tbody> </table> {{??}} <h2>No snapshots for {{= data.group_name }}</h2> {{?}}
</script>