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 |