Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: tools/testing/perf_testing/run_perf_tests.py

Issue 204733004: Added TodoMVC startup benchmarks. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 2
3 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 3 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
4 # for details. All rights reserved. Use of this source code is governed by a 4 # for details. All rights reserved. Use of this source code is governed by a
5 # BSD-style license that can be found in the LICENSE file. 5 # BSD-style license that can be found in the LICENSE file.
6 6
7 import datetime 7 import datetime
8 import math 8 import math
9 import optparse 9 import optparse
10 import os 10 import os
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 out.seek(0, os.SEEK_END) 71 out.seek(0, os.SEEK_END)
72 p = subprocess.Popen(cmd_list, stdout = out, stderr=subprocess.PIPE, 72 p = subprocess.Popen(cmd_list, stdout = out, stderr=subprocess.PIPE,
73 stdin=subprocess.PIPE, shell=self.has_shell) 73 stdin=subprocess.PIPE, shell=self.has_shell)
74 output, stderr = p.communicate(std_in) 74 output, stderr = p.communicate(std_in)
75 if output: 75 if output:
76 print output 76 print output
77 if stderr: 77 if stderr:
78 print stderr 78 print stderr
79 return output, stderr 79 return output, stderr
80 80
81 def RunBrowserPerfRunnerCmd(self, browser, url_path, file_path_to_test_code,
82 trace_file, code_root=''):
83 command_list = [os.path.join(DART_REPO_LOC, utils.GetBuildRoot(
84 utils.GuessOS(), 'release', 'ia32'), 'dart-sdk', 'bin', 'dart'),
85 '--package-root=%s' % os.path.join(file_path_to_test_code, 'packages'),
86 os.path.join(file_path_to_test_code, 'packages',
87 'browser_controller', 'browser_perf_testing.dart'), '--browser',
88 browser, '--test_path=%s' % url_path]
89 if code_root != '':
90 command_list += ['--code_root=%s' % code_root]
91 self.RunCmd(command_list, trace_file, append=True)
92
81 def TimeCmd(self, cmd): 93 def TimeCmd(self, cmd):
82 """Determine the amount of (real) time it takes to execute a given 94 """Determine the amount of (real) time it takes to execute a given
83 command.""" 95 command."""
84 start = time.time() 96 start = time.time()
85 self.RunCmd(cmd) 97 self.RunCmd(cmd)
86 return time.time() - start 98 return time.time() - start
87 99
88 def ClearOutUnversionedFiles(self): 100 def ClearOutUnversionedFiles(self):
89 """Remove all files that are unversioned by svn.""" 101 """Remove all files that are unversioned by svn."""
90 if os.path.exists(DART_REPO_LOC): 102 if os.path.exists(DART_REPO_LOC):
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 or 'InvalidUriError' in stderr or "Couldn't download" in stdout or 181 or 'InvalidUriError' in stderr or "Couldn't download" in stdout or
170 'Unable to download' in stdout): 182 'Unable to download' in stdout):
171 # Couldn't find the SDK on Google Storage. Build it locally. 183 # Couldn't find the SDK on Google Storage. Build it locally.
172 184
173 # TODO(efortuna): Currently always building ia32 architecture because we 185 # TODO(efortuna): Currently always building ia32 architecture because we
174 # don't have test statistics for what's passing on x64. Eliminate arch 186 # don't have test statistics for what's passing on x64. Eliminate arch
175 # specification when we have tests running on x64, too. 187 # specification when we have tests running on x64, too.
176 shutil.rmtree(os.path.join(os.getcwd(), 188 shutil.rmtree(os.path.join(os.getcwd(),
177 utils.GetBuildRoot(utils.GuessOS())), 189 utils.GetBuildRoot(utils.GuessOS())),
178 onerror=TestRunner._OnRmError) 190 onerror=TestRunner._OnRmError)
179 lines = self.RunCmd([os.path.join('.', 'tools', 'build.py'), '-m', 191 lines = self.RunCmd(['python', os.path.join('tools', 'build.py'), '-m',
180 'release', '--arch=ia32', 'create_sdk']) 192 'release', '--arch=ia32', 'create_sdk'])
181 193
182 for line in lines: 194 for line in lines:
183 if 'BUILD FAILED' in line: 195 if 'BUILD FAILED' in line:
184 # Someone checked in a broken build! Stop trying to make it work 196 # Someone checked in a broken build! Stop trying to make it work
185 # and wait to try again. 197 # and wait to try again.
186 print 'Broken Build' 198 print 'Broken Build'
187 return 1 199 return 1
188 return 0 200 return 0
189 201
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 726
715 class DromaeoPerfTester(DromaeoTester): 727 class DromaeoPerfTester(DromaeoTester):
716 def RunTests(self): 728 def RunTests(self):
717 """Run dromaeo in the browser.""" 729 """Run dromaeo in the browser."""
718 success, _, _ = self.test.test_runner.GetArchive('dartium') 730 success, _, _ = self.test.test_runner.GetArchive('dartium')
719 if not success: 731 if not success:
720 # Unable to download dartium. Try later. 732 # Unable to download dartium. Try later.
721 return 733 return
722 734
723 # Build tests. 735 # Build tests.
724 # TODO(efortuna): Make the pub functionality a separate function.
725 current_path = os.getcwd() 736 current_path = os.getcwd()
726 os.chdir(os.path.join(DART_REPO_LOC, 'samples', 'third_party', 737 os.chdir(os.path.join(DART_REPO_LOC, 'samples', 'third_party',
727 'dromaeo')) 738 'dromaeo'))
728 self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
729 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
730 'dart-sdk', 'bin', 'pub'), 'install']) # TODO: pub upgrade?
731 stdout, _ = self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC, 739 stdout, _ = self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
732 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'), 740 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
733 'dart-sdk', 'bin', 'pub'), 'build']) 741 'dart-sdk', 'bin', 'pub'), 'build', '--mode=debug'])
Jennifer Messerly 2014/03/19 19:27:57 should this be debug? Might be worth a comment eit
Emily Fortuna 2014/03/24 19:45:56 Yes, this is debug on purpose. Siggi and I discuss
734 os.chdir(current_path) 742 os.chdir(current_path)
735 if 'failed' in stdout: 743 if 'failed' in stdout:
736 return 744 return
737 745
738 versions = DromaeoTester.GetDromaeoVersions() 746 versions = DromaeoTester.GetDromaeoVersions()
739 747
740 for browser in BrowserTester.GetBrowsers(): 748 for browser in BrowserTester.GetBrowsers():
741 for version_name in versions: 749 for version_name in versions:
742 if not self.test.IsValidCombination(browser, version_name): 750 if not self.test.IsValidCombination(browser, version_name):
743 continue 751 continue
744 version = DromaeoTest.DromaeoPerfTester.GetDromaeoUrlQuery( 752 version = DromaeoTest.DromaeoPerfTester.GetDromaeoUrlQuery(
745 browser, version_name) 753 browser, version_name)
746 self.test.trace_file = os.path.join(TOP_LEVEL_DIR, 754 self.test.trace_file = os.path.join(TOP_LEVEL_DIR,
747 'tools', 'testing', 'perf_testing', self.test.result_folder_name, 755 'tools', 'testing', 'perf_testing', self.test.result_folder_name,
748 'dromaeo-%s-%s-%s' % (self.test.cur_time, browser, version_name)) 756 'dromaeo-%s-%s-%s' % (self.test.cur_time, browser, version_name))
749 self.AddSvnRevisionToTrace(self.test.trace_file, browser) 757 self.AddSvnRevisionToTrace(self.test.trace_file, browser)
750 url_path = '/'.join(['/code_root', 'build', 'web', 'index%s.html?%s'%( 758 url_path = '/'.join(['/code_root', 'build', 'web', 'index%s.html?%s'%(
751 '-dart' if version_name == 'dart_html' else '-js', 759 '-dart' if version_name == 'dart_html' else '-js',
752 version)]) 760 version)])
753 761
754 self.test.test_runner.RunCmd( 762 self.test.test_runner.RunBrowserPerfRunnerCmd(browser, url_path,
755 [os.path.join(DART_REPO_LOC, utils.GetBuildRoot( 763 os.path.join(DART_REPO_LOC, 'samples', 'third_party', 'dromaeo'),
756 utils.GuessOS(), 'release', 'ia32'), 'dart-sdk', 'bin', 'dart'), 764 self.test.trace_file)
757 '--package-root=%s' % os.path.join(DART_REPO_LOC, 'samples',
758 'third_party', 'dromaeo', 'packages'), os.path.join(
759 DART_REPO_LOC, 'samples', 'third_party', 'dromaeo', 'packages',
760 'browser_controller', 'browser_perf_testing.dart'),
761 '--browser', browser,
762 '--test_path', url_path], self.test.trace_file,
763 append=True)
764 765
765 @staticmethod 766 @staticmethod
766 def GetDromaeoUrlQuery(browser, version): 767 def GetDromaeoUrlQuery(browser, version):
767 version = version.replace('_','AND') 768 version = version.replace('_','AND')
768 tags = DromaeoTester.GetValidDromaeoTags() 769 tags = DromaeoTester.GetValidDromaeoTags()
769 return 'OR'.join([ '%sAND%s' % (version, tag) for tag in tags]) 770 return 'OR'.join([ '%sAND%s' % (version, tag) for tag in tags])
770 771
771 772
772 class DromaeoFileProcessor(Processor): 773 class DromaeoFileProcessor(Processor):
773 def ProcessFile(self, afile, should_post_file): 774 def ProcessFile(self, afile, should_post_file):
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 upload_success = upload_success and self.ReportResults( 811 upload_success = upload_success and self.ReportResults(
811 name, score, browser, version, revision_num, 812 name, score, browser, version, revision_num,
812 self.GetScoreType(name)) 813 self.GetScoreType(name))
813 else: 814 else:
814 upload_success = False 815 upload_success = False
815 816
816 f.close() 817 f.close()
817 self.CalculateGeometricMean(browser, version, revision_num) 818 self.CalculateGeometricMean(browser, version, revision_num)
818 return upload_success 819 return upload_success
819 820
821 class TodoMVCTester(BrowserTester):
822 @staticmethod
823 def GetVersions():
824 return ['js', 'dart2js_html', 'dart_html']
825
826 @staticmethod
827 def GetBenchmarks():
828 return ['TodoMVCstartup']
829
830 class TodoMVCStartupTest(RuntimePerformanceTest):
831 """Start up TodoMVC and see how long it takes to start."""
832 def __init__(self, test_runner):
833 super(TodoMVCStartupTest, self).__init__(
834 self.Name(),
835 BrowserTester.GetBrowsers(True),
836 'browser',
837 TodoMVCTester.GetVersions(),
838 TodoMVCTester.GetBenchmarks(), test_runner,
839 self.TodoMVCStartupTester(self),
840 self.TodoMVCFileProcessor(self))
841
842 @staticmethod
843 def Name():
844 return 'todoMvcStartup'
845
846 class TodoMVCStartupTester(BrowserTester):
847 def RunTests(self):
848 """Run dromaeo in the browser."""
849 success, _, _ = self.test.test_runner.GetArchive('dartium')
850 if not success:
851 # Unable to download dartium. Try later.
852 return
853
854 dromaeo_path = os.path.join('samples', 'third_party', 'dromaeo')
Jennifer Messerly 2014/03/19 19:27:57 future TODO: maybe we should move both of these ou
Emily Fortuna 2014/03/24 19:45:56 I'm going to leave this as is for now because of t
855 current_path = os.getcwd()
856
857 os.chdir(os.path.join(DART_REPO_LOC, 'samples', 'third_party',
858 'todomvc_performance'))
Jennifer Messerly 2014/03/19 19:27:57 fyi -- I was thinking of moving TodoMVC out of thi
859 self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
860 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
861 'dart-sdk', 'bin', 'pub'), 'build', '--mode=debug'])
862 os.chdir('js_todomvc');
863 self.test.test_runner.RunCmd([os.path.join(DART_REPO_LOC,
864 utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32'),
865 'dart-sdk', 'bin', 'pub'), 'get'])
866
867 versions = TodoMVCTester.GetVersions()
868
869 for browser in BrowserTester.GetBrowsers():
870 for version_name in versions:
871 if not self.test.IsValidCombination(browser, version_name):
872 continue
873 self.test.trace_file = os.path.join(TOP_LEVEL_DIR,
874 'tools', 'testing', 'perf_testing', self.test.result_folder_name,
875 'todoMvcStartup-%s-%s-%s' % (self.test.cur_time, browser,
876 version_name))
877 self.AddSvnRevisionToTrace(self.test.trace_file, browser)
878
879 if version_name == 'js':
880 code_root = os.path.join(DART_REPO_LOC, 'samples', 'third_party',
881 'todomvc_performance', 'js_todomvc')
882 self.test.test_runner.RunBrowserPerfRunnerCmd(browser,
883 '/code_root/index.html', code_root, self.test.trace_file,
884 code_root)
885 else:
886 self.test.test_runner.RunBrowserPerfRunnerCmd(browser,
887 '/code_root/build/web/startup-performance.html', os.path.join(
888 DART_REPO_LOC, 'samples', 'third_party', 'todomvc_performance'),
889 self.test.trace_file)
890
891 class TodoMVCFileProcessor(Processor):
892 def ProcessFile(self, afile, should_post_file):
893 """Comb through the html to find the performance results.
894 Returns: True if we successfully posted our data to storage."""
895 parts = afile.split('-')
896 browser = parts[2]
897 version = parts[3]
898
899 bench_dict = self.test.values_dict[browser][version]
900
901 f = self.OpenTraceFile(afile, should_post_file)
902 lines = f.readlines()
903 i = 0
904 revision_num = 0
905 revision_pattern = r'Revision: (\d+)'
906 result_pattern = r'The startup time is (\d+)'
907
908 upload_success = True
909 for line in lines:
910 rev = re.match(revision_pattern, line.strip().replace('"', ''))
911 if rev:
912 revision_num = int(rev.group(1))
913 continue
914
915 results = re.search(result_pattern, line)
916 if results:
917 score = float(results.group(1))
918 name = TodoMVCTester.GetBenchmarks()[0]
919 bench_dict[name] += [float(score)]
920 self.test.revision_dict[browser][version][name] += \
921 [revision_num]
922 if not self.test.test_runner.no_upload and should_post_file:
923 upload_success = upload_success and self.ReportResults(
924 name, score, browser, version, revision_num,
925 self.GetScoreType(name))
926
927 f.close()
928 self.CalculateGeometricMean(browser, version, revision_num)
929 return upload_success
930
931
820 class TestBuilder(object): 932 class TestBuilder(object):
821 """Construct the desired test object.""" 933 """Construct the desired test object."""
822 available_suites = dict((suite.Name(), suite) for suite in [ 934 available_suites = dict((suite.Name(), suite) for suite in [
823 DromaeoTest]) 935 DromaeoTest, TodoMVCStartupTest])
824 936
825 @staticmethod 937 @staticmethod
826 def MakeTest(test_name, test_runner): 938 def MakeTest(test_name, test_runner):
827 return TestBuilder.available_suites[test_name](test_runner) 939 return TestBuilder.available_suites[test_name](test_runner)
828 940
829 @staticmethod 941 @staticmethod
830 def AvailableSuiteNames(): 942 def AvailableSuiteNames():
831 return TestBuilder.available_suites.keys() 943 return TestBuilder.available_suites.keys()
832 944
833 945
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 else: 1061 else:
950 if runner.backfill: 1062 if runner.backfill:
951 results_set = FillInBackHistory(results_set, runner) 1063 results_set = FillInBackHistory(results_set, runner)
952 else: 1064 else:
953 time.sleep(200) 1065 time.sleep(200)
954 else: 1066 else:
955 runner.RunTestSequence() 1067 runner.RunTestSequence()
956 1068
957 if __name__ == '__main__': 1069 if __name__ == '__main__':
958 main() 1070 main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698