Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:convert'; | 5 import 'dart:convert'; |
| 6 import 'dart:io'; | 6 import 'dart:io'; |
| 7 | 7 |
| 8 import 'package:analysis_server/protocol/protocol_generated.dart'; | 8 import 'package:analysis_server/protocol/protocol_generated.dart'; |
| 9 import 'package:analysis_server/src/analysis_server.dart'; | 9 import 'package:analysis_server/src/analysis_server.dart'; |
| 10 import 'package:analysis_server/src/domain_completion.dart'; | 10 import 'package:analysis_server/src/domain_completion.dart'; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 } | 101 } |
| 102 | 102 |
| 103 td.pre { | 103 td.pre { |
| 104 white-space: pre; | 104 white-space: pre; |
| 105 } | 105 } |
| 106 | 106 |
| 107 .nowrap { | 107 .nowrap { |
| 108 white-space: nowrap; | 108 white-space: nowrap; |
| 109 } | 109 } |
| 110 | 110 |
| 111 .scroll-table { | |
| 112 max-height: 190px; | |
| 113 overflow-x: auto; | |
| 114 } | |
| 115 | |
| 111 .footer { | 116 .footer { |
| 112 padding-top: 3rem; | 117 padding-top: 3rem; |
| 113 padding-bottom: 3rem; | 118 padding-bottom: 3rem; |
| 114 margin-top: 3rem; | 119 margin-top: 3rem; |
| 115 line-height: 1.75; | 120 line-height: 1.75; |
| 116 color: #7a7a7a; | 121 color: #7a7a7a; |
| 117 border-top: 1px solid #eee; | 122 border-top: 1px solid #eee; |
| 118 } | 123 } |
| 119 | 124 |
| 120 .footer strong { | 125 .footer strong { |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 421 class ProfilePage extends DiagnosticPageWithNav { | 426 class ProfilePage extends DiagnosticPageWithNav { |
| 422 ProfilePage(DiagnosticsSite site) | 427 ProfilePage(DiagnosticsSite site) |
| 423 : super(site, 'profile', 'Profiling Info', | 428 : super(site, 'profile', 'Profiling Info', |
| 424 description: 'Profiling performance tag data.'); | 429 description: 'Profiling performance tag data.'); |
| 425 | 430 |
| 426 @override | 431 @override |
| 427 void generateContent(Map<String, String> params) { | 432 void generateContent(Map<String, String> params) { |
| 428 // prepare sorted tags | 433 // prepare sorted tags |
| 429 List<PerformanceTag> tags = PerformanceTag.all.toList(); | 434 List<PerformanceTag> tags = PerformanceTag.all.toList(); |
| 430 tags.remove(ServerPerformanceStatistics.idle); | 435 tags.remove(ServerPerformanceStatistics.idle); |
| 431 tags.removeWhere((tag) => tag.label == 'unknown'); | 436 tags.remove(PerformanceTag.UNKNOWN); |
| 432 tags.sort((a, b) => b.elapsedMs - a.elapsedMs); | 437 tags.sort((a, b) => b.elapsedMs - a.elapsedMs); |
| 433 | 438 |
| 434 // draw a pie chart | 439 // draw a pie chart |
| 435 String rowData = | 440 String rowData = |
| 436 tags.map((tag) => "['${tag.label}', ${tag.elapsedMs}]").join(','); | 441 tags.map((tag) => "['${tag.label}', ${tag.elapsedMs}]").join(','); |
| 437 buf.writeln( | 442 buf.writeln( |
| 438 '<div id="chart-div" style="width: 700px; height: 300px;"></div>'); | 443 '<div id="chart-div" style="width: 700px; height: 300px;"></div>'); |
| 439 buf.writeln(''' | 444 buf.writeln(''' |
| 440 <script type="text/javascript"> | 445 <script type="text/javascript"> |
| 441 google.charts.load('current', {'packages':['corechart']}); | 446 google.charts.load('current', {'packages':['corechart']}); |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 459 p('Total measured time: ${printMilliseconds(totalTime)}'); | 464 p('Total measured time: ${printMilliseconds(totalTime)}'); |
| 460 | 465 |
| 461 // write out a table | 466 // write out a table |
| 462 void _writeRow(List<String> data, {bool header: false}) { | 467 void _writeRow(List<String> data, {bool header: false}) { |
| 463 buf.write('<tr>'); | 468 buf.write('<tr>'); |
| 464 if (header) { | 469 if (header) { |
| 465 for (String d in data) { | 470 for (String d in data) { |
| 466 buf.write('<th>$d</th>'); | 471 buf.write('<th>$d</th>'); |
| 467 } | 472 } |
| 468 } else { | 473 } else { |
| 469 for (String d in data) { | 474 buf.write('<td>${data[0]}</td>'); |
| 470 buf.write('<td>$d</td>'); | 475 |
| 476 for (String d in data.sublist(1)) { | |
| 477 buf.write('<td class="right">$d</td>'); | |
| 471 } | 478 } |
| 472 } | 479 } |
| 473 buf.writeln('</tr>'); | 480 buf.writeln('</tr>'); |
| 474 } | 481 } |
| 475 | 482 |
| 476 buf.write('<table>'); | 483 buf.write('<table>'); |
| 477 _writeRow(['Tag name', 'Time (in ms)', 'Percent'], header: true); | 484 _writeRow(['Tag name', 'Time (in ms)', 'Percent'], header: true); |
| 478 void writeRow(PerformanceTag tag) { | 485 void writeRow(PerformanceTag tag) { |
| 479 double percent = tag.elapsedMs / totalTime; | 486 double percent = tag.elapsedMs / totalTime; |
| 480 _writeRow([ | 487 _writeRow([ |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 600 addedFiles.sort(); | 607 addedFiles.sort(); |
| 601 implicitFiles.sort(); | 608 implicitFiles.sort(); |
| 602 | 609 |
| 603 String lenCounter(List list) { | 610 String lenCounter(List list) { |
| 604 return '<span class="counter" style="float: right;">${list.length}</span>' ; | 611 return '<span class="counter" style="float: right;">${list.length}</span>' ; |
| 605 } | 612 } |
| 606 | 613 |
| 607 h3('Context files'); | 614 h3('Context files'); |
| 608 | 615 |
| 609 h4('Priority files ${lenCounter(priorityFiles)}', raw: true); | 616 h4('Priority files ${lenCounter(priorityFiles)}', raw: true); |
| 610 inputList(priorityFiles, (file) => buf.write(file)); | 617 ul(priorityFiles, (file) => buf.write(file), classes: 'scroll-table'); |
| 611 | 618 |
| 612 h4('Added files ${lenCounter(addedFiles)}', raw: true); | 619 h4('Added files ${lenCounter(addedFiles)}', raw: true); |
| 613 inputList(addedFiles, (file) => buf.write(file)); | 620 ul(addedFiles, (file) => buf.write(file), classes: 'scroll-table'); |
| 614 | 621 |
| 615 h4('ImplicitFiles files ${lenCounter(implicitFiles)}', raw: true); | 622 h4('ImplicitFiles files ${lenCounter(implicitFiles)}', raw: true); |
| 616 inputList(implicitFiles, (file) => buf.write(file)); | 623 ul(implicitFiles, (file) => buf.write(file), classes: 'scroll-table'); |
| 617 | 624 |
| 618 SourceFactory sourceFactory = driver.sourceFactory; | 625 SourceFactory sourceFactory = driver.sourceFactory; |
| 619 if (sourceFactory is SourceFactoryImpl) { | 626 if (sourceFactory is SourceFactoryImpl) { |
| 620 h3('Resolvers'); | 627 h3('Resolvers'); |
| 621 for (UriResolver resolver in sourceFactory.resolvers) { | 628 for (UriResolver resolver in sourceFactory.resolvers) { |
| 622 h4(resolver.runtimeType.toString()); | 629 h4(resolver.runtimeType.toString()); |
| 623 buf.write('<p>'); | 630 buf.write('<p class="scroll-table">'); |
| 624 if (resolver is DartUriResolver) { | 631 if (resolver is DartUriResolver) { |
| 625 DartSdk sdk = resolver.dartSdk; | 632 DartSdk sdk = resolver.dartSdk; |
| 626 buf.write(' (sdk = '); | 633 buf.write(' (sdk = '); |
| 627 buf.write(sdk.runtimeType); | 634 buf.write(sdk.runtimeType); |
| 628 if (sdk is FolderBasedDartSdk) { | 635 if (sdk is FolderBasedDartSdk) { |
| 629 buf.write(' (path = '); | 636 buf.write(' (path = '); |
| 630 buf.write(sdk.directory.path); | 637 buf.write(sdk.directory.path); |
| 631 buf.write(')'); | 638 buf.write(')'); |
| 632 } else if (sdk is EmbedderSdk) { | 639 } else if (sdk is EmbedderSdk) { |
| 633 buf.write(' (map = '); | 640 buf.write(' (map = '); |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 883 } | 890 } |
| 884 | 891 |
| 885 buf.writeln('<div class="columns">'); | 892 buf.writeln('<div class="columns">'); |
| 886 | 893 |
| 887 ServerPerformance perf = server.performanceAfterStartup; | 894 ServerPerformance perf = server.performanceAfterStartup; |
| 888 if (perf != null) { | 895 if (perf != null) { |
| 889 buf.writeln('<div class="column one-half">'); | 896 buf.writeln('<div class="column one-half">'); |
| 890 h3('Current'); | 897 h3('Current'); |
| 891 | 898 |
| 892 int requestCount = perf.requestCount; | 899 int requestCount = perf.requestCount; |
| 893 double averageLatency = | 900 int averageLatency = |
| 894 requestCount > 0 ? (perf.requestLatency / requestCount) : 0.0; | 901 requestCount > 0 ? (perf.requestLatency / requestCount) : 0; |
|
Brian Wilkerson
2017/05/31 13:50:50
Did you want to use integer division (here and bel
devoncarew
2017/05/31 14:14:30
Yup, done.
| |
| 895 int maximumLatency = perf.maxLatency; | 902 int maximumLatency = perf.maxLatency; |
| 896 double slowRequestPercent = | 903 double slowRequestPercent = |
| 897 requestCount > 0 ? (perf.slowRequestCount / requestCount) : 0.0; | 904 requestCount > 0 ? (perf.slowRequestCount / requestCount) : 0.0; |
| 898 | 905 |
| 899 buf.write('<table>'); | 906 buf.write('<table>'); |
| 900 writeRow([printInteger(requestCount), 'requests'], | 907 writeRow([printInteger(requestCount), 'requests'], |
| 901 classes: ["right", null]); | 908 classes: ["right", null]); |
| 902 writeRow([printMilliseconds(averageLatency), 'average latency'], | 909 writeRow([printMilliseconds(averageLatency), 'average latency'], |
| 903 classes: ["right", null]); | 910 classes: ["right", null]); |
| 904 writeRow([printMilliseconds(maximumLatency), 'maximum latency'], | 911 writeRow([printMilliseconds(maximumLatency), 'maximum latency'], |
| 905 classes: ["right", null]); | 912 classes: ["right", null]); |
| 906 writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'], | 913 writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'], |
| 907 classes: ["right", null]); | 914 classes: ["right", null]); |
| 908 buf.write('</table>'); | 915 buf.write('</table>'); |
| 916 | |
| 917 String time = server.uptime.toString(); | |
| 918 if (time.contains('.')) { | |
| 919 time = time.substring(0, time.indexOf('.')); | |
| 920 } | |
| 921 buf.writeln(writeOption('Uptime', time)); | |
| 922 | |
| 909 buf.write('</div>'); | 923 buf.write('</div>'); |
| 910 } | 924 } |
| 911 | 925 |
| 912 buf.writeln('<div class="column one-half">'); | 926 buf.writeln('<div class="column one-half">'); |
| 913 h3('Startup'); | 927 h3('Startup'); |
| 914 perf = server.performanceDuringStartup; | 928 perf = server.performanceDuringStartup; |
| 915 | 929 |
| 916 int requestCount = perf.requestCount; | 930 int requestCount = perf.requestCount; |
| 917 double averageLatency = | 931 int averageLatency = |
| 918 requestCount > 0 ? (perf.requestLatency / requestCount) : 0.0; | 932 requestCount > 0 ? (perf.requestLatency / requestCount) : 0; |
| 919 int maximumLatency = perf.maxLatency; | 933 int maximumLatency = perf.maxLatency; |
| 920 double slowRequestPercent = | 934 double slowRequestPercent = |
| 921 requestCount > 0 ? (perf.slowRequestCount / requestCount) : 0.0; | 935 requestCount > 0 ? (perf.slowRequestCount / requestCount) : 0.0; |
| 922 | 936 |
| 923 buf.write('<table>'); | 937 buf.write('<table>'); |
| 924 writeRow([printInteger(requestCount), 'requests'], | 938 writeRow([printInteger(requestCount), 'requests'], |
| 925 classes: ["right", null]); | 939 classes: ["right", null]); |
| 926 writeRow([printMilliseconds(averageLatency), 'average latency'], | 940 writeRow([printMilliseconds(averageLatency), 'average latency'], |
| 927 classes: ["right", null]); | 941 classes: ["right", null]); |
| 928 writeRow([printMilliseconds(maximumLatency), 'maximum latency'], | 942 writeRow([printMilliseconds(maximumLatency), 'maximum latency'], |
| 929 classes: ["right", null]); | 943 classes: ["right", null]); |
| 930 writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'], | 944 writeRow([printPercentage(slowRequestPercent), '> 150 ms latency'], |
| 931 classes: ["right", null]); | 945 classes: ["right", null]); |
| 932 buf.write('</table>'); | 946 buf.write('</table>'); |
| 933 | 947 |
| 934 if (server.performanceAfterStartup != null) { | 948 if (server.performanceAfterStartup != null) { |
| 935 int startupTime = | 949 int startupTime = |
| 936 server.performanceAfterStartup.startTime - perf.startTime; | 950 server.performanceAfterStartup.startTime - perf.startTime; |
| 937 p('(initial analysis time: ${printMilliseconds(startupTime)})'); | 951 buf.writeln( |
| 952 writeOption('Initial analysis time', printMilliseconds(startupTime))); | |
| 938 } | 953 } |
| 939 buf.write('</div>'); | 954 buf.write('</div>'); |
| 940 | 955 |
| 941 buf.write('</div>'); | 956 buf.write('</div>'); |
| 942 } | 957 } |
| 943 } | 958 } |
| 944 | 959 |
| 945 String writeOption(String name, dynamic value) { | 960 String writeOption(String name, dynamic value) { |
| 946 return '$name: <code>$value</code><br> '; | 961 return '$name: <code>$value</code><br> '; |
| 947 } | 962 } |
| 948 | 963 |
| 949 String get _sdkVersion { | 964 String get _sdkVersion { |
| 950 String version = Platform.version; | 965 String version = Platform.version; |
| 951 if (version.contains(' ')) { | 966 if (version.contains(' ')) { |
| 952 version = version.substring(0, version.indexOf(' ')); | 967 version = version.substring(0, version.indexOf(' ')); |
| 953 } | 968 } |
| 954 return version; | 969 return version; |
| 955 } | 970 } |
| OLD | NEW |