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

Unified Diff: functional/perf.py

Issue 8548002: Adding CPU performance test for Youtube video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/chrome/test/
Patch Set: '' Created 9 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « data/media/youtube.html ('k') | functional/youtube.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: functional/perf.py
===================================================================
--- functional/perf.py (revision 109125)
+++ functional/perf.py (working copy)
@@ -22,6 +22,7 @@
"""
import BaseHTTPServer
+import commands
import logging
import math
import os
@@ -497,32 +498,110 @@
pyauto.PyUITest.__init__(self, methodName, **kwargs)
YoutubeTestHelper.__init__(self, self)
- def testYoutubeDroppedFrames(self):
- """Measures the Youtube video dropped frames. Runs for 60 secs."""
+ def GetCPUUsage(self):
+ """Returns machine's CPU usage
+
+ It uses /proc/stat to count CPU usage.
+ Returns:
+ A dictionary with user, nice, system and idle values.
+ Sample dictionary :
+ {
+ 'user': 254544,
+ 'nice': 9,
+ 'system': 254768,
+ 'idle': 2859878,
+ }
+ """
+ file = open('/proc/stat')
+ cpu = file.readline().split()
Nirnimesh 2011/11/15 08:11:29 merge with previous line. you don't need the |file
+ return {
+ 'user': int(cpu[1]),
+ 'nice': int(cpu[2]),
+ 'system': int(cpu[3]),
+ 'idle': int(cpu[4])
+ }
+
+ def VerifyVideoTotalBytes(self):
+ """Returns true if video total bytes information is available"""
+ return self.GetVideoTotalBytes() > 0
+
+ def VerifyVideoLoadedBytes(self):
+ """Returns true if video loaded bytes information is available"""
+ return self.GetVideoLoadedBytes() > 0
+
+ def StartVideoForPerformance(self):
+ """Start the test video with all required buffering"""
self.PlayVideoAndAssert()
self.ExecuteJavascript("""
ytplayer.setPlaybackQuality('hd720');
window.domAutomationController.send('');
""")
+ self.AssertPlayingState()
+ self.assertTrue(
+ self.WaitUntil(self.VerifyVideoTotalBytes, expect_retval=True),
+ msg='Failed to get video total bytes information.')
+ self.assertTrue(
+ self.WaitUntil(self.VerifyVideoLoadedBytes, expect_retval=True),
+ msg='Failed to get video loaded bytes information')
+ loaded_video_bytes = self.GetVideoLoadedBytes()
+ total_video_bytes = self.GetVideoTotalBytes()
+ self.PauseVideo()
+ count = 0
+ while total_video_bytes > loaded_video_bytes:
+ loaded_video_bytes = self.GetVideoLoadedBytes()
+ time.sleep(1)
+ count = count + 1
+ self.PlayVideo()
+ # Ignoring first 10 seconds of video playing so we get smooth
+ # videoplayback.
+ time.sleep(10)
+
+ def testYoutubeDroppedFrames(self):
+ """Measures the Youtube video dropped frames. Runs for 60 secs."""
+ self.StartVideoForPerformance()
+ init_dropped_frames = self.GetVideoDroppedFrames()
total_dropped_frames = 0
dropped_fps = []
- youtube_apis = self.GetPrivateInfo()['youtube_api']
- youtube_debug_text = youtube_apis['GetDebugText']
for _ in xrange(60):
- video_data = self.ExecuteJavascript(
- 'window.domAutomationController.send(%s);' % youtube_debug_text)
- # Video data returns total dropped frames so far, so calculating
- # the dropped frames for the last second.
- matched = re.search('droppedFrames=([\d\.]+)', video_data)
- if matched:
- frames = int(matched.group(1))
+ frames = self.GetVideoDroppedFrames() - init_dropped_frames
current_dropped_frames = frames - total_dropped_frames
dropped_fps.append(current_dropped_frames)
total_dropped_frames = frames
+ # Play the video for some time
time.sleep(1)
self._PrintSummaryResults('YoutubeDroppedFrames', dropped_fps, 'frames')
+ def testYoutubeCPU(self):
+ """Measure the Youtube video CPU usage. Runs for 60 seconds.
+ Measures the Youtube video CPU usage (between 0 and 1) extrapolated to
+ totalframes in the video by taking dropped frames into account. For smooth
+ videoplayback this number should be < 0.5..1.0 on a hyperthreaded CPU.
+ """
+ self.StartVideoForPerformance()
+ init_dropped_frames = self.GetVideoDroppedFrames()
+ cpu_usage1 = self.GetCPUUsage()
+ total_shown_frames = 0
+ for _ in xrange(60):
+ total_shown_frames = total_shown_frames + self.GetVideoFrames()
+ # Play the video for some time
+ time.sleep(1)
+ total_dropped_frames = self.GetVideoDroppedFrames() - init_dropped_frames
+ cpu_usage2 = self.GetCPUUsage()
+
+ x2 = cpu_usage2['user'] + cpu_usage2['nice'] + cpu_usage2['system']
+ x1 = cpu_usage1['user'] + cpu_usage1['nice'] + cpu_usage1['system']
+ y2 = cpu_usage2['user'] + cpu_usage2['nice'] + \
+ cpu_usage2['system'] + cpu_usage2['idle']
+ y1 = cpu_usage1['user'] + cpu_usage1['nice'] + \
+ cpu_usage1['system'] + cpu_usage1['idle']
+ total_frames = total_shown_frames + total_dropped_frames
+ # Counting extrapolation for utilization to play the video
+ self._PrintSummaryResults('YoutubeCPUExtrapolation',
+ [((float(x2) - x1) / (y2 - y1)) * total_frames/total_shown_frames],
+ 'extrapolation')
+
+
class FileUploadDownloadTest(BasePerfTest):
"""Tests that involve measuring performance of upload and download."""
« no previous file with comments | « data/media/youtube.html ('k') | functional/youtube.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698