blob: e014ad2fa7ad19c61b8255e126922f73c7876dcf [file] [log] [blame]
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# EAS Testing - PCMark benchmark on Android"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The goal of this experiment is to run benchmarks on a Nexus N5X running Android with an EAS kernel and collect results. The analysis phase will consist in comparing EAS with other schedulers, that is comparing *sched* governor with:\n",
"\n",
" - interactive\n",
" - performance\n",
" - powersave\n",
" - ondemand\n",
" \n",
"The benchmark we will be using is ***PCMark*** (https://www.futuremark.com/benchmarks/pcmark-android). You will need to **manually install** the app on the Android device in order to run this Notebook.\n",
"\n",
"When opinening PCMark for the first time you will need to Install the work benchmark from inside the app."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import logging\n",
"from conf import LisaLogging\n",
"LisaLogging.setup()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"source": [
"%pylab inline\n",
"\n",
"import copy\n",
"import os\n",
"from time import sleep\n",
"from subprocess import Popen\n",
"import pandas as pd\n",
"\n",
"# Support to access the remote target\n",
"import devlib\n",
"from env import TestEnv\n",
"\n",
"# Support for trace events analysis\n",
"from trace import Trace\n",
"\n",
"# Suport for FTrace events parsing and visualization\n",
"import trappy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test Environment set up"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In case more than one Android device are conencted to the host, you must specify the ID of the device you want to target in `my_target_conf`. Run `adb devices` on your host to get the ID."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Setup a target configuration\n",
"my_target_conf = {\n",
" \n",
" # Target platform and board\n",
" \"platform\" : 'android',\n",
"\n",
" # Add target support\n",
" \"board\" : 'n5x',\n",
" \n",
" # Device ID\n",
" #\"device\" : \"00b1346f0878ccb1\",\n",
" \n",
" # Define devlib modules to load\n",
" \"modules\" : [\n",
" 'cpufreq' # enable CPUFreq support\n",
" ],\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"my_tests_conf = {\n",
"\n",
" # Folder where all the results will be collected\n",
" \"results_dir\" : \"Android_PCMark\",\n",
"\n",
" # Platform configurations to test\n",
" \"confs\" : [\n",
" {\n",
" \"tag\" : \"pcmark\",\n",
" \"flags\" : \"ftrace\", # Enable FTrace events\n",
" \"sched_features\" : \"ENERGY_AWARE\", # enable EAS\n",
" },\n",
" ],\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2016-04-04 09:56:39,384 INFO : Target - Using base path: /home/pippo/work/lisa\n",
"2016-04-04 09:56:39,385 INFO : Target - Loading custom (inline) target configuration\n",
"2016-04-04 09:56:39,386 INFO : Target - Loading custom (inline) test configuration\n",
"2016-04-04 09:56:39,386 INFO : Target - Devlib modules to load: ['bl', 'cpufreq']\n",
"2016-04-04 09:56:39,387 INFO : Target - Connecting Android target [DEFAULT]\n",
"2016-04-04 09:56:39,772 INFO : Target - Initializing target workdir:\n",
"2016-04-04 09:56:39,774 INFO : Target - /data/local/tmp/devlib-target\n",
"2016-04-04 09:56:41,938 INFO : Target - Topology:\n",
"2016-04-04 09:56:41,940 INFO : Target - [[0, 1, 2, 3], [4, 5]]\n",
"2016-04-04 09:56:42,062 INFO : TestEnv - Set results folder to:\n",
"2016-04-04 09:56:42,063 INFO : TestEnv - /home/pippo/work/lisa/results/Android_PCMark\n",
"2016-04-04 09:56:42,064 INFO : TestEnv - Experiment results available also in:\n",
"2016-04-04 09:56:42,065 INFO : TestEnv - /home/pippo/work/lisa/results_latest\n"
]
}
],
"source": [
"# Initialize a test environment using:\n",
"# the provided target configuration (my_target_conf)\n",
"# the provided test configuration (my_test_conf)\n",
"te = TestEnv(target_conf=my_target_conf, test_conf=my_tests_conf)\n",
"target = te.target"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Support Functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This set of support functions will help us running the benchmark using different CPUFreq governors."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def set_performance():\n",
" target.cpufreq.set_all_governors('performance')\n",
"\n",
"def set_powersave():\n",
" target.cpufreq.set_all_governors('powersave')\n",
"\n",
"def set_interactive():\n",
" target.cpufreq.set_all_governors('interactive')\n",
"\n",
"def set_sched():\n",
" target.cpufreq.set_all_governors('sched')\n",
"\n",
"def set_ondemand():\n",
" target.cpufreq.set_all_governors('ondemand')\n",
" \n",
" for cpu in target.list_online_cpus():\n",
" tunables = target.cpufreq.get_governor_tunables(cpu)\n",
" target.cpufreq.set_governor_tunables(\n",
" cpu,\n",
" 'ondemand',\n",
" **{'sampling_rate' : tunables['sampling_rate_min']}\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# CPUFreq configurations to test\n",
"confs = {\n",
" 'performance' : {\n",
" 'label' : 'prf',\n",
" 'set' : set_performance,\n",
" },\n",
" #'powersave' : {\n",
" # 'label' : 'pws',\n",
" # 'set' : set_powersave,\n",
" #},\n",
" 'interactive' : {\n",
" 'label' : 'int',\n",
" 'set' : set_interactive,\n",
" },\n",
" #'sched' : {\n",
" # 'label' : 'sch',\n",
" # 'set' : set_sched,\n",
" #},\n",
" #'ondemand' : {\n",
" # 'label' : 'odm',\n",
" # 'set' : set_ondemand,\n",
" #}\n",
"}\n",
"\n",
"# The set of results for each comparison test\n",
"results = {}"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def check_packages(pkgname):\n",
" try:\n",
" output = target.execute('pm list packages -f | grep -i {}'.format(pkgname))\n",
" except Exception:\n",
" raise RuntimeError('Package: [{}] not availabe on target'.format(pkgname))\n",
"\n",
"# Check for specified PKG name being available on target\n",
"check_packages('com.futuremark.pcmark.android.benchmark')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def pcmark_run(exp_dir):\n",
" # Unlock device screen (assume no password required)\n",
" target.execute('input keyevent 82')\n",
" # Start PCMark on the target device\n",
" target.execute('monkey -p com.futuremark.pcmark.android.benchmark -c android.intent.category.LAUNCHER 1')\n",
" # Wait few seconds to make sure the app is loaded\n",
" sleep(5)\n",
" \n",
" # Flush entire log\n",
" target.clear_logcat()\n",
" \n",
" # Run performance workload (assume screen is vertical)\n",
" target.execute('input tap 750 1450')\n",
" # Wait for completion (7 minutes in total) and collect log\n",
" log_file = os.path.join(exp_dir, 'log.txt')\n",
" # Wait 5 minutes\n",
" sleep(300)\n",
" # Start collecting the log\n",
" with open(log_file, 'w') as log:\n",
" logcat = Popen(['adb logcat', 'com.futuremark.pcmandroid.VirtualMachineState:*', '*:S'],\n",
" stdout=log,\n",
" shell=True)\n",
" # Wait additional two minutes for benchmark to complete\n",
" sleep(120)\n",
"\n",
" # Terminate logcat\n",
" logcat.kill()\n",
"\n",
" # Get scores from logcat\n",
" score_file = os.path.join(exp_dir, 'score.txt')\n",
" os.popen('grep -o \"PCMA_.*_SCORE .*\" {} | sed \"s/ = / /g\" | sort -u > {}'.format(log_file, score_file))\n",
" \n",
" # Close application\n",
" target.execute('am force-stop com.futuremark.pcmark.android.benchmark')\n",
" \n",
" return score_file"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def experiment(governor, exp_dir):\n",
" os.system('mkdir -p {}'.format(exp_dir));\n",
"\n",
" logging.info('------------------------')\n",
" logging.info('Run workload using %s governor', governor)\n",
" confs[governor]['set']()\n",
"\n",
" ### Run the benchmark ###\n",
" score_file = pcmark_run(exp_dir)\n",
" \n",
" # Save the score as a dictionary\n",
" scores = dict()\n",
" with open(score_file, 'r') as f:\n",
" lines = f.readlines()\n",
" for l in lines:\n",
" info = l.split()\n",
" scores.update({info[0] : float(info[1])})\n",
" \n",
" # return all the experiment data\n",
" return {\n",
" 'dir' : exp_dir,\n",
" 'scores' : scores,\n",
" }"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Run PCMark and collect scores"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2016-04-04 09:57:04,879 INFO : ------------------------\n",
"2016-04-04 09:57:04,881 INFO : Run workload using performance governor\n",
"2016-04-04 10:04:13,684 INFO : ------------------------\n",
"2016-04-04 10:04:13,685 INFO : Run workload using interactive governor\n"
]
}
],
"source": [
"# Run the benchmark in all the configured governors\n",
"for governor in confs:\n",
" test_dir = os.path.join(te.res_dir, governor)\n",
" res = experiment(governor, test_dir)\n",
" results[governor] = copy.deepcopy(res)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"After running the benchmark for the specified governors we can show the scores"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>interactive</th>\n",
" <th>performance</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>PCMA_PHOTO_EDITING_SCORE</th>\n",
" <td>7847.595587</td>\n",
" <td>9281.817920</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PCMA_VIDEO_PLAYBACK_SCORE</th>\n",
" <td>3519.155975</td>\n",
" <td>3484.256511</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PCMA_WEB_SCORE</th>\n",
" <td>6201.226146</td>\n",
" <td>6444.737547</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PCMA_WORK_SCORE</th>\n",
" <td>4676.950746</td>\n",
" <td>4934.220982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PCMA_WRITING_SCORE</th>\n",
" <td>2793.820407</td>\n",
" <td>2843.976358</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" interactive performance\n",
"PCMA_PHOTO_EDITING_SCORE 7847.595587 9281.817920\n",
"PCMA_VIDEO_PLAYBACK_SCORE 3519.155975 3484.256511\n",
"PCMA_WEB_SCORE 6201.226146 6444.737547\n",
"PCMA_WORK_SCORE 4676.950746 4934.220982\n",
"PCMA_WRITING_SCORE 2793.820407 2843.976358"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Create results DataFrame\n",
"data = {}\n",
"for governor in confs:\n",
" data[governor] = {}\n",
" for score_name, score in results[governor]['scores'].iteritems():\n",
" data[governor][score_name] = score\n",
"\n",
"df = pd.DataFrame.from_dict(data)\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA60AAAJXCAYAAAB427IUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmYXFWBN+Bfk7DGhCSgQCALAkqCDGEQERXNiMMgIosL\nyCY4GVwQccFREZU4A4h+4oKKKDCBgKCCG7KJAxPABXAQUURB0QQTWZRA0jAiS/r749xKVzfdIeks\nfdK87/PU03W3qlPVp2/f3z3nnpsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwDIZNtgFAGBIOyfJ\nTkn+Z5DLMZTMSfKrJH9cCa91Tvx+AKjcWoNdAABWijlJ/i9JZ5J7k8xMMqJt+b8kuS7JoiT3J5md\n5LXNsiOSLE7ymV6vuW8zf+YKlKurefBUL0vykyQPJXkgyY+SvHAZtluZ32n7a01L+X13tj2+t5Le\nBwAGTGgFGBq6kuydZGSSf0wJPx9plr0hyTdTWtU2T/KcJB9Ld2hNkruSvDE9e+AcnuTODDwgtV6r\nY4Dbr2w1/c8bleTSJJ9PMibl9/LxJH8fhLK0/37mp9Sh1mPfPtYfir20VuZn6kg9dR5gSKjpHzgA\nK8efk1yZZLtm+jNJ/iPJf6W0niWl1fWtzfOulNbZX6W0yCbJ2CS7JrkkPQ/AL0pyT0rr4LVJprQt\nOyfJl5NcnuThlJa7diNTuqF+rp9yH5ESnhcl+UOSg9uWHZnk9mbZr5Ps2MyfnNJq/GCS29IziPdV\nnnFJvpXS2vyHJO9qW/9FSf43ycKU7+PUfsr5mySvaZsenuQvSaYmWS/J+Un+2pTpppSTBL09L+V7\n/0bz89EkP0z5HfT3mae2Ldsxya0pv4evJ1m3bdneSX7RvP+Pk2zfa7ufN6/59aa8T+eI5nU+03yu\nE5Ksk+TTSeamfFdf7vVa/55SD+cl+deUFtzn9vP6W6a7F8APk3wpyXlty/dJ+fwPptSfbZv5H0yp\nj+0+3zySZMMkZ7eV4z/TfdzT+zPNSOlR8KWUkwmLktzQq8wvSfKzlO/8ppS/j5bZSU5sXvORZrsj\n0n99BgCAZ5w/Jtm9eT4+JcB9POUAf3GSiUvZ9ogk1yc5KCXIJMlRSc5IOdCf2WvdEUnWTvLZJLe0\nLTsn5YC+dTC/brPtfyTZKOVA/z/6KcOIlLC4TTO9SboD8RtTQsdOzfRWSSY0Zfh9kg+lBMd/SgkI\nz+unPOsnuTmlBXp4Sli6K8kezfKfJjmkeb5Bkl36KetHU4Jpy2tSQlWSvC0l6K+XEvZ3TAnrvY1M\nCUvnJNkzpbW1XX+fOSldwW9Ismmz3e3N+6Z5v/uS7Ny8/5tT6sbaKUFzbpJ3p7Qsvj7JY+n+nUxL\n8qc+ynpEkseTvDMl9K2X8rv/bpLRSZ7VfOaTm/X3TAmyU1K+xwuSPJn+Q+tPk3wq5Xfy0pR6MKtZ\n9ryUEw67N2X+9yS/a9admBIQn9WsOywloL6omf5OSpheP8mzk9yY7hM1fX2mc1J+Jy9sXuv8JBc2\n649NCc2HNOu/KcmCdP/eZqf8XiY3yzdM//UZAACekeaktKI+2Dz/YkpofGlKaF1nKdsekRJa10sJ\nG6NSgsSueWpobTe6ee1WKDunebSbmdLa9askxy6lDCOasr8uJWS0+0F6toi27JbS6tvugpSWwL7K\ns0tKaGt3XEoLdFJajmck2Xgp5UxKgFyU7pbFr6W7K/Zb8tTWzf5sm/L9/CklQH0v3a2y/X3mpITQ\n9la7T6aEszQ/e58Y+G2SlzeP+b2W/Tg9Q+uTKb+H1uONKfWj/XvrSAmS7SF015TWxKR8nye3Ldsm\n/be0Tkj57O2ttOelO7R+NN0nUlrvPa/5LEmpt4c1z/855SRGUkLio71e96Ak1zTPe3+mpPwuvto2\n/eqUVvU073FDr/V/ktKFPiktwDPali2tPgOwnHQPBhgaulKuPxyTZFKSo1Ouj3ygWb7ZMrzGo0ku\nSwkKY1OCa3vX4GFJTkkJBgvTPXptK+R15aktdR0pLZHrJfnKUt77kSQHJnl7SmvZpUme3yzbIqVF\ntLdxfbzf3GZ+qzzz2pZNbJa1h7Lj0h0Up6e07P0mpVW4vQtwu7uadfZJaUl8bUpYTkrg+kFK0Jqf\nEiiH9/M6v00JueOTvKApW6vrdH+fueXetud/S3dr48SUkwPtn3GLlN//uDw1tPYObn9OqUOtR6v7\nbfv3/OyUz31z23tcke56sFmv9e9eyucYl9Ji+WjbvHm9lrdv36pjmzfTF6SE0aQE+a81zyemtC7f\n01bGM5qyt/TVqnxf2/P277V3OZKeda336y2tPgOwnIRWgKHtjpSD6Tcs4/qzkrwvPbu/thycEtR2\nT+n+uGUzf2mDznQlOTMlyF2eEnb6c1VKV91NUwLdmc38PyXZuo/1/5wS+Nrff2J6BrP2QaTuTgna\n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\n7+eggw7KwoULs88+++Too49Okpx33nmZMGFCLr300nR2dub9739/5s+fn7333jsf+9jH8uCDD+bT\nn/50Xv/61+eBBx5Y8nrnn39+zjrrrDz88MOZOHFiNtlkk1x22WVZtGhRZs6cmfe+97255ZZbkiQ3\n3XRTDj/88Jx66qlZuHBhrrvuukyaNCknnXRSdtttt3zpS19KZ2dnTjvttB7l32WXXTJixIhcffXV\nS+ZdcMEFOeSQQ5IkX/jCF3LJJZfkuuuuyz333JMxY8bkne985yr7PpeF0AoAALCcOjo6sttuu2XP\nPfdMR0dHDj300Nx66639rn/++ednr732yp577pkkedWrXpUXvvCFueyyy5a83hFHHJHJkydnrbXW\nyvDhw7PXXntlyy23TJK8/OUvzx577JHrr78+SXL22Wdn+vTp2X333ZMk48aNy/Of//wl77e0rskH\nHXRQLrzwwiTlWtcrrrgiBx10UJLkK1/5Sk488cSMGzcua6+9dk444YRcfPHFWbx48UC/qhUmtAIA\nAAzAJptssuT5BhtskEcffbTfcDd37txcdNFFGTNmzJLHj3/849x7771L1hk/fnyPba644oq8+MUv\nzkYbbZQxY8bk8ssvX9IyO2/evGy11Vb9lm1p17UedNBB+fa3v53HHnss3/72t7PTTjstee85c+Zk\n//33X1LGKVOmZPjw4bnvvvue/gtZRQzEBAAAsJL1Do0TJkzIYYcd9pTrUvvb5u9//3te//rX5/zz\nz8++++6bYcOGZf/991/Sgjp+/Pj8/ve/X6b37m3KlCmZOHFirrjiilxwwQU5+OCDe5Rz5syZ2XXX\nXZ/2M64uWloBAACW09ONDLzJJpvkrrvuWjJ96KGH5vvf/36uuuqqPPnkk3n00Ucze/bszJ8/v8/X\nfOyxx/LYY49l4403zlprrZUrrrgiV1111ZLl06dPz8yZM3PNNddk8eLFmT9/fu64444+37svBx98\ncD73uc/l+uuvzxvf+MYl89/+9rfnwx/+cO6+++4kyV/+8pdccskly/CNrDpCKwAAwHJov79r7/kt\nxx13XE488cSMGTMmn/nMZ7LFFlvke9/7Xk4++eQ85znPyYQJE3Lqqaf2CKrt248cOTKnnXZaDjjg\ngIwdOzYXXnhh9t133yXLd9555yWDM40ePTrTpk1bEjTf/e535+KLL87YsWPznve8p8/PcNBBB+W6\n667L7rvvnrFju+9R++53vzv77LNP9thjj4waNSq77rprbrrpphX7wlbQmnIDn66B3uMIAABY8/S+\nz+moUWObe7WuGiNHjsmiRQtW2etT9Hf/2iaw95lPhVYAAKA6/YUb1mwDCa26BwMAAFAtoRUAAIBq\nCa0AAABUS2gFAACgWkIrAAAA1RJaAQAAqJbQCgAAQLWEVgAAgEFwxx13ZOrUqRk1alS++MUvDnZx\nqjV8sAsAAADwdEaNHpXOhZ2r7PVHbjgyix5atMpevy+f+tSnsvvuu+cXv/jFan3fNY3QSpJVvxNY\nFQZjxwIAwODoXNiZzFiFrz9j9R0LP/HEExk+fHjmzp2bl7zkJQN6jSeffDLDhg1bySWrU8dgF2AZ\ndXV1dQ12GYa0jo6OVboTWCVmJOoFAMDQ1NHR0eNYb5Ufr85YtmPLSZMm5e1vf3vOO++83HPPPdlv\nv/3y5S9/Oeuuu24uvfTSfOQjH8ncuXMzZcqUnHHGGdl+++2XbHfUUUfla1/7Wu6444689KUvzbXX\nXpu11147a6+9dn7+85/n2c9+dt71rnflyiuvzAYbbJAjjzwyH/7wh9PR0ZFzzjknZ555ZnbZZZfM\nmjUr73jHOzJv3rysv/76mTNnTq6//vpMnTo1F110UT7xiU9k1qxZ2XTTTXPhhRdm6tSpSZJTTjkl\nZ511Vu6///6MHz8+J510Uvbbb78kyTnnnJOzzjoru+66a84+++yMHj06p59+evbcc88kyYIFC3Ls\nscfmqquuyt/+9re84hWvyHe+850kWern7q3377V9fvrJp65pBQAAWA4XXHBBrrrqqtx111258847\nc+KJJ+aWW27J9OnTc+aZZ2bBggV529veln322SePP/74ku2+/vWv5/LLL8/ChQtz9dVXZ7fddsuX\nvvSlLFq0KFtvvXXe9a53pbOzM3/84x9z7bXXZtasWZk5c+aS7W+66aZstdVWuf/++3P88cenq6sr\nF110UU466aT89a9/zTrrrJMXv/jF2XnnnbNgwYK84Q1vyPve974l22+99db50Y9+lEWLFuWEE07I\noYcemvvuu6/H62+77bZ54IEH8oEPfCDTp09fsuywww7Lo48+mttvvz3333//ktft73M/9thjK+37\nFloBAACWUUdHR44++uhsvvnmGTNmTI4//vhceOGFOfPMM/O2t70tO++8czo6OvLmN7856667bm64\n4YYl2x1zzDHZfPPNs+666y55vVar45NPPplvfOMb+cQnPpERI0Zk4sSJOfbYY3PeeectWXfcuHF5\n5zvfmbXWWivrrbdeOjo68rrXvS477rhj1l133ey///4ZMWJEDj300HR0dOSAAw7ILbfcsmT7N7zh\nDdl0002TJAcccEC22Wab3HjjjUuWT5w4MdOnT19S/nvuuSf3339/7rnnnlx55ZU544wzsuGGG2b4\n8OHZbbfdkiRf/epXl/q5VwahFQAAYDmMHz9+yfMJEybkz3/+c+bOnZtTTz01Y8aMWfKYN29e/vzn\nP/e5XUvTLTZ//etf8/jjj2fixIk9Xnv+/PlL3f45z3nOkufrrbdej+n1118/Dz/88JLpWbNmZccd\nd1xSvttuuy0PPPDAkuWtQJskG2ywQZLk4Ycfzp/+9KeMHTs2G2644VPev7/Pfc899zxl3YEyEBMA\nAMByuPvuu3s8HzduXCZMmJDjjz8+H/7wh/vdrhVQ+7Lxxhtn7bXXzpw5czJ58uQlr73FFlss0/ZP\nZ+7cuXnrW9+aa665Jrvuums6Ojqy4447LtN1vOPHj8+CBQuycOHCpwTXZfncK0pLKwAAwDLq6urK\n6aefnvnz52fBggU56aST8qY3vSn/9m//ljPOOCM33XRTurq68sgjj+Syyy7r0dLZ3+slybBhw3LA\nAQfk+OOPz8MPP5y5c+fms5/9bA499NCn3XZZPPLII+no6MjGG2+cxYsXZ+bMmbntttuWadvNNtss\nr371q3PUUUfloYceyuOPP57rrrsuSXLkkUcO6HMvD6EVAABgGXV0dOTggw/OHnvska222irbbLNN\nPvKRj2SnnXbKmWeemaOPPjpjx47NNttsk1mzZj1t62j78i984QsZMWJEnvvc52a33XbLIYcckre8\n5S1L1uv9Wr3n9bdOkkyZMiXHHntsdt1112y66aa57bbb8rKXvWyZtk2S8847L2uvvXa23XbbbLLJ\nJjnttNOSpN/PvTK55Q1J3PIGAIC69L41yqjRo8q9WleRkRuOzKKHFj3teltuuWXOPvvsvPKVr1xl\nZRnKBnLLG9e0AgAA1VuWQMnQpHswAAAA1dLSCgAAsIz++Mc/DnYRnnG0tAIAAFAtoRUAAIBqCa0A\nAABUyzWtAABAdcaMGfO09zhlzTNmzJjl3kZoBQAAqrNgwYLBLgKV0D0YAACAagmtAAAAVEtoBQAA\n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\nKfvrF6WMdfHLZj37aajA5JR7qv1bep48+WqS76dc4/e8lPtS3R4DLFC3LVJuG3Jgr/mbJjk65dqV\nb6eMCnhnkv2a5c/47j4MSGv/eWS6u1ImycyUuvbPKb1W7D9ZU2yU5Ocpl1UkPY8L3pByqcU1KccI\nd6S7TtuHUrvRSW5I6fHS2/ZJ/pByfPD1lN6E6jZUZK0kZyV5VzPdkTLc93bNsvel3LbhZ0muTLJv\n23r+iKnRTin/cFr2TfL5lJC6X0qo/VBKTwIDhrAi1koJp0c30x0pB/zbNss+mNKD5Wcp17naf7Im\n2CRlRPWWw1NGT70h5XKK9ZLskuSf0n3ttjrNmmBikh+0Tb855Rj4kub58CQ7p/SaaXWFV7f7MPzp\nV4GVrtXd4c/Nz4+nBNadm3mvSRnue6OUm4cvSs9+/VCbh5M8lhIk9m6m/5ZyoLVVkquTnNK2vvrM\nilic7mtTT0g50Nm5mffalG6Vz06pkwujvlG/ziSvSGlJ3S7lftZzk1yYcteAnZPc2Md26jS1m5vS\nHfiylAFFH0wZm+XclBPb96YMRNqbug2V2DclmP4y5Y/1LSmD1MxM+SfV+wyTM07UbnqS/5fSWvAP\nbfP/O2WkS1hZ3pju/ecPUureein3sz6/j/XtP6lZqyvwRklOTDkRMy7lAD8ptw7750EoF6yo1r53\nXJIPpFyfPSFlf52U+7C6ZzZUrPUP6vkpg9T8//buPMqOusz/+DuddNhC0gkICYTIEuh0CIKRIBhA\nQARC2EUGBJUfm44rP1ZBzagMsu8giiKMqCiyiAsooKADuACCyKIQdxlGcB+3OQrMH5+qU9U33Ul3\nB25Xd96vc3LurbrVOfXH99b9Ls/3eTqAlYpz+wDnYCdLI8fSEtptQfZptaavl4aqfDZuSjJQj6V6\nfu5Hknj4/NRIUG+n4/o4BwkNfpSqHJ40WryUTDxuM9w3Iql//cXqzyOF7xf28ZnUFKtTla4ptbbn\nKcBuwENUewql54PPT410rZUA+jKDRBA8StWmnYzRSFVvu1OAQ0nb3qOPzyUNk7HLvoTVgKMxa5qa\nbyrZX/XiZVw3Dzif3j9Itmm9ECaQkgk+PzUSrEq1R3VpViZ5AHYrjn2GqunWpSpBtjRrkpJNtm2p\nQWaS+P0dgInLuLaH1KcCv8BqrrFkD/ZAkth1Fa9jsCa2Bm8DUhJsC6r9T/2ZQzKrgs9PNdsk4C4y\n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\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fb1f6f80c10>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df.plot(kind='bar', rot=45, figsize=(16,8),\n",
" title='PCMark scores vs SchedFreq governors');"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
},
"toc": {
"toc_cell": false,
"toc_number_sections": true,
"toc_threshold": 6,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 0
}