1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and limitations under the 13 * License. 14 * 15 */ 16 17 package com.android.benchmark.app; 18 19 import android.content.Intent; 20 import android.os.AsyncTask; 21 import android.os.Bundle; 22 import android.os.Handler; 23 import android.support.v4.app.FragmentManager; 24 import android.support.v4.app.FragmentTransaction; 25 import android.support.v4.app.ListFragment; 26 import android.support.v7.app.AppCompatActivity; 27 import android.util.Log; 28 import android.view.LayoutInflater; 29 import android.view.View; 30 import android.view.ViewGroup; 31 import android.widget.BaseAdapter; 32 import android.widget.ListView; 33 import android.widget.TextView; 34 35 import com.android.benchmark.R; 36 import com.android.benchmark.registry.BenchmarkGroup; 37 import com.android.benchmark.registry.BenchmarkRegistry; 38 import com.android.benchmark.results.GlobalResultsStore; 39 import com.android.benchmark.results.UiBenchmarkResult; 40 import com.android.benchmark.synthetic.MemoryActivity; 41 import com.android.benchmark.ui.BitmapUploadActivity; 42 import com.android.benchmark.ui.EditTextInputActivity; 43 import com.android.benchmark.ui.FullScreenOverdrawActivity; 44 import com.android.benchmark.ui.ImageListViewScrollActivity; 45 import com.android.benchmark.ui.ListViewScrollActivity; 46 import com.android.benchmark.ui.ShadowGridActivity; 47 import com.android.benchmark.ui.TextScrollActivity; 48 49 import org.apache.commons.math.stat.descriptive.SummaryStatistics; 50 51 import java.util.ArrayList; 52 import java.util.HashMap; 53 54 public class RunLocalBenchmarksActivity extends AppCompatActivity { 55 56 public static final int RUN_COUNT = 5; 57 58 private ArrayList<LocalBenchmark> mBenchmarksToRun; 59 private int mBenchmarkCursor; 60 private int mCurrentRunId; 61 private boolean mFinish; 62 63 private Handler mHandler = new Handler(); 64 65 private static final int[] ALL_TESTS = new int[] { 66 R.id.benchmark_list_view_scroll, 67 R.id.benchmark_image_list_view_scroll, 68 R.id.benchmark_shadow_grid, 69 R.id.benchmark_text_high_hitrate, 70 R.id.benchmark_text_low_hitrate, 71 R.id.benchmark_edit_text_input, 72 R.id.benchmark_overdraw, 73 }; 74 75 public static class LocalBenchmarksList extends ListFragment { 76 private ArrayList<LocalBenchmark> mBenchmarks; 77 private int mRunId; 78 79 public void setBenchmarks(ArrayList<LocalBenchmark> benchmarks) { 80 mBenchmarks = benchmarks; 81 } 82 83 public void setRunId(int id) { 84 mRunId = id; 85 } 86 87 @Override 88 public void onListItemClick(ListView l, View v, int position, long id) { 89 if (getActivity().findViewById(R.id.list_fragment_container) != null) { 90 FragmentManager fm = getActivity().getSupportFragmentManager(); 91 UiResultsFragment resultsView = new UiResultsFragment(); 92 String testName = BenchmarkRegistry.getBenchmarkName(v.getContext(), 93 mBenchmarks.get(position).id); 94 resultsView.setRunInfo(testName, mRunId); 95 FragmentTransaction fragmentTransaction = fm.beginTransaction(); 96 fragmentTransaction.replace(R.id.list_fragment_container, resultsView); 97 fragmentTransaction.addToBackStack(null); 98 fragmentTransaction.commit(); 99 } 100 } 101 } 102 103 104 private class LocalBenchmark { 105 int id; 106 int runCount = 0; 107 int totalCount = 0; 108 ArrayList<String> mResultsUri = new ArrayList<>(); 109 110 LocalBenchmark(int id, int runCount) { 111 this.id = id; 112 this.runCount = 0; 113 this.totalCount = runCount; 114 } 115 116 } 117 118 @Override 119 protected void onCreate(Bundle savedInstanceState) { 120 super.onCreate(savedInstanceState); 121 setContentView(R.layout.activity_running_list); 122 123 initLocalBenchmarks(getIntent()); 124 125 if (findViewById(R.id.list_fragment_container) != null) { 126 FragmentManager fm = getSupportFragmentManager(); 127 LocalBenchmarksList listView = new LocalBenchmarksList(); 128 listView.setListAdapter(new LocalBenchmarksListAdapter(LayoutInflater.from(this))); 129 listView.setBenchmarks(mBenchmarksToRun); 130 listView.setRunId(mCurrentRunId); 131 fm.beginTransaction().add(R.id.list_fragment_container, listView).commit(); 132 } 133 134 TextView scoreView = (TextView) findViewById(R.id.score_text_view); 135 scoreView.setText("Running tests!"); 136 } 137 138 private int translateBenchmarkIndex(int index) { 139 if (index >= 0 && index < ALL_TESTS.length) { 140 return ALL_TESTS[index]; 141 } 142 143 return -1; 144 } 145 146 private void initLocalBenchmarks(Intent intent) { 147 mBenchmarksToRun = new ArrayList<>(); 148 int[] enabledIds = intent.getIntArrayExtra(BenchmarkGroup.BENCHMARK_EXTRA_ENABLED_TESTS); 149 int runCount = intent.getIntExtra(BenchmarkGroup.BENCHMARK_EXTRA_RUN_COUNT, RUN_COUNT); 150 mFinish = intent.getBooleanExtra(BenchmarkGroup.BENCHMARK_EXTRA_FINISH, false); 151 152 if (enabledIds == null) { 153 // run all tests 154 enabledIds = ALL_TESTS; 155 } 156 157 StringBuilder idString = new StringBuilder(); 158 idString.append(runCount); 159 idString.append(System.currentTimeMillis()); 160 161 for (int i = 0; i < enabledIds.length; i++) { 162 int id = enabledIds[i]; 163 System.out.println("considering " + id); 164 if (!isValidBenchmark(id)) { 165 System.out.println("not valid " + id); 166 id = translateBenchmarkIndex(id); 167 System.out.println("got out " + id); 168 System.out.println("expected: " + R.id.benchmark_overdraw); 169 } 170 171 if (isValidBenchmark(id)) { 172 int localRunCount = runCount; 173 if (isCompute(id)) { 174 localRunCount = 1; 175 } 176 mBenchmarksToRun.add(new LocalBenchmark(id, localRunCount)); 177 idString.append(id); 178 } 179 } 180 181 mBenchmarkCursor = 0; 182 mCurrentRunId = idString.toString().hashCode(); 183 } 184 185 private boolean isCompute(int id) { 186 switch (id) { 187 case R.id.benchmark_cpu_gflops: 188 case R.id.benchmark_cpu_heat_soak: 189 case R.id.benchmark_memory_bandwidth: 190 case R.id.benchmark_memory_latency: 191 case R.id.benchmark_power_management: 192 return true; 193 default: 194 return false; 195 } 196 } 197 198 private static boolean isValidBenchmark(int benchmarkId) { 199 switch (benchmarkId) { 200 case R.id.benchmark_list_view_scroll: 201 case R.id.benchmark_image_list_view_scroll: 202 case R.id.benchmark_shadow_grid: 203 case R.id.benchmark_text_high_hitrate: 204 case R.id.benchmark_text_low_hitrate: 205 case R.id.benchmark_edit_text_input: 206 case R.id.benchmark_overdraw: 207 case R.id.benchmark_memory_bandwidth: 208 case R.id.benchmark_memory_latency: 209 case R.id.benchmark_power_management: 210 case R.id.benchmark_cpu_heat_soak: 211 case R.id.benchmark_cpu_gflops: 212 return true; 213 default: 214 return false; 215 } 216 } 217 218 @Override 219 protected void onResume() { 220 super.onResume(); 221 mHandler.postDelayed(new Runnable() { 222 @Override 223 public void run() { 224 runNextBenchmark(); 225 } 226 }, 1000); 227 } 228 229 private void computeOverallScore() { 230 final TextView scoreView = (TextView) findViewById(R.id.score_text_view); 231 scoreView.setText("Computing score..."); 232 new AsyncTask<Void, Void, Integer>() { 233 @Override 234 protected Integer doInBackground(Void... voids) { 235 GlobalResultsStore gsr = 236 GlobalResultsStore.getInstance(RunLocalBenchmarksActivity.this); 237 ArrayList<Double> testLevelScores = new ArrayList<>(); 238 final SummaryStatistics stats = new SummaryStatistics(); 239 for (LocalBenchmark b : mBenchmarksToRun) { 240 HashMap<String, ArrayList<UiBenchmarkResult>> detailedResults = 241 gsr.loadDetailedResults(mCurrentRunId); 242 for (ArrayList<UiBenchmarkResult> testResult : detailedResults.values()) { 243 for (UiBenchmarkResult res : testResult) { 244 int score = res.getScore(); 245 if (score == 0) { 246 score = 1; 247 } 248 stats.addValue(score); 249 } 250 251 testLevelScores.add(stats.getGeometricMean()); 252 stats.clear(); 253 } 254 255 } 256 257 for (double score : testLevelScores) { 258 stats.addValue(score); 259 } 260 261 return (int)Math.round(stats.getGeometricMean()); 262 } 263 264 @Override 265 protected void onPostExecute(Integer score) { 266 TextView view = (TextView) 267 RunLocalBenchmarksActivity.this.findViewById(R.id.score_text_view); 268 view.setText("Score: " + score); 269 } 270 }.execute(); 271 } 272 273 private void runNextBenchmark() { 274 LocalBenchmark benchmark = mBenchmarksToRun.get(mBenchmarkCursor); 275 boolean runAgain = false; 276 277 if (benchmark.runCount < benchmark.totalCount) { 278 runBenchmarkForId(mBenchmarksToRun.get(mBenchmarkCursor).id, benchmark.runCount++); 279 } else if (mBenchmarkCursor + 1 < mBenchmarksToRun.size()) { 280 mBenchmarkCursor++; 281 benchmark = mBenchmarksToRun.get(mBenchmarkCursor); 282 runBenchmarkForId(benchmark.id, benchmark.runCount++); 283 } else if (runAgain) { 284 mBenchmarkCursor = 0; 285 initLocalBenchmarks(getIntent()); 286 287 runBenchmarkForId(mBenchmarksToRun.get(mBenchmarkCursor).id, benchmark.runCount); 288 } else if (mFinish) { 289 finish(); 290 } else { 291 Log.i("BENCH", "BenchmarkDone!"); 292 computeOverallScore(); 293 } 294 } 295 296 private void runBenchmarkForId(int id, int iteration) { 297 Intent intent; 298 int syntheticTestId = -1; 299 300 System.out.println("iteration: " + iteration); 301 302 switch (id) { 303 case R.id.benchmark_list_view_scroll: 304 intent = new Intent(getApplicationContext(), ListViewScrollActivity.class); 305 break; 306 case R.id.benchmark_image_list_view_scroll: 307 intent = new Intent(getApplicationContext(), ImageListViewScrollActivity.class); 308 break; 309 case R.id.benchmark_shadow_grid: 310 intent = new Intent(getApplicationContext(), ShadowGridActivity.class); 311 break; 312 case R.id.benchmark_text_high_hitrate: 313 intent = new Intent(getApplicationContext(), TextScrollActivity.class); 314 intent.putExtra(TextScrollActivity.EXTRA_HIT_RATE, 80); 315 intent.putExtra(BenchmarkRegistry.EXTRA_ID, id); 316 break; 317 case R.id.benchmark_text_low_hitrate: 318 intent = new Intent(getApplicationContext(), TextScrollActivity.class); 319 intent.putExtra(TextScrollActivity.EXTRA_HIT_RATE, 20); 320 intent.putExtra(BenchmarkRegistry.EXTRA_ID, id); 321 break; 322 case R.id.benchmark_edit_text_input: 323 intent = new Intent(getApplicationContext(), EditTextInputActivity.class); 324 break; 325 case R.id.benchmark_overdraw: 326 intent = new Intent(getApplicationContext(), BitmapUploadActivity.class); 327 break; 328 case R.id.benchmark_memory_bandwidth: 329 syntheticTestId = 0; 330 intent = new Intent(getApplicationContext(), MemoryActivity.class); 331 intent.putExtra("test", syntheticTestId); 332 break; 333 case R.id.benchmark_memory_latency: 334 syntheticTestId = 1; 335 intent = new Intent(getApplicationContext(), MemoryActivity.class); 336 intent.putExtra("test", syntheticTestId); 337 break; 338 case R.id.benchmark_power_management: 339 syntheticTestId = 2; 340 intent = new Intent(getApplicationContext(), MemoryActivity.class); 341 intent.putExtra("test", syntheticTestId); 342 break; 343 case R.id.benchmark_cpu_heat_soak: 344 syntheticTestId = 3; 345 intent = new Intent(getApplicationContext(), MemoryActivity.class); 346 intent.putExtra("test", syntheticTestId); 347 break; 348 case R.id.benchmark_cpu_gflops: 349 syntheticTestId = 4; 350 intent = new Intent(getApplicationContext(), MemoryActivity.class); 351 intent.putExtra("test", syntheticTestId); 352 break; 353 354 default: 355 intent = null; 356 } 357 358 if (intent != null) { 359 intent.putExtra("com.android.benchmark.RUN_ID", mCurrentRunId); 360 intent.putExtra("com.android.benchmark.ITERATION", iteration); 361 startActivityForResult(intent, id & 0xffff, null); 362 } 363 } 364 365 @Override 366 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 367 switch (requestCode) { 368 case R.id.benchmark_shadow_grid: 369 case R.id.benchmark_list_view_scroll: 370 case R.id.benchmark_image_list_view_scroll: 371 case R.id.benchmark_text_high_hitrate: 372 case R.id.benchmark_text_low_hitrate: 373 case R.id.benchmark_edit_text_input: 374 break; 375 default: 376 } 377 } 378 379 class LocalBenchmarksListAdapter extends BaseAdapter { 380 381 private final LayoutInflater mInflater; 382 383 LocalBenchmarksListAdapter(LayoutInflater inflater) { 384 mInflater = inflater; 385 } 386 387 @Override 388 public int getCount() { 389 return mBenchmarksToRun.size(); 390 } 391 392 @Override 393 public Object getItem(int i) { 394 return mBenchmarksToRun.get(i); 395 } 396 397 @Override 398 public long getItemId(int i) { 399 return mBenchmarksToRun.get(i).id; 400 } 401 402 @Override 403 public View getView(int i, View convertView, ViewGroup parent) { 404 if (convertView == null) { 405 convertView = mInflater.inflate(R.layout.running_benchmark_list_item, null); 406 } 407 408 TextView name = (TextView) convertView.findViewById(R.id.benchmark_name); 409 name.setText(BenchmarkRegistry.getBenchmarkName( 410 RunLocalBenchmarksActivity.this, mBenchmarksToRun.get(i).id)); 411 return convertView; 412 } 413 414 } 415 } 416