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 androidx.fragment.app.FragmentManager; 24 import androidx.fragment.app.FragmentTransaction; 25 import androidx.fragment.app.ListFragment; 26 import androidx.appcompat.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 R.id.benchmark_bitmap_upload, 74 }; 75 76 public static class LocalBenchmarksList extends ListFragment { 77 private ArrayList<LocalBenchmark> mBenchmarks; 78 private int mRunId; 79 setBenchmarks(ArrayList<LocalBenchmark> benchmarks)80 public void setBenchmarks(ArrayList<LocalBenchmark> benchmarks) { 81 mBenchmarks = benchmarks; 82 } 83 setRunId(int id)84 public void setRunId(int id) { 85 mRunId = id; 86 } 87 88 @Override onListItemClick(ListView l, View v, int position, long id)89 public void onListItemClick(ListView l, View v, int position, long id) { 90 if (getActivity().findViewById(R.id.list_fragment_container) != null) { 91 FragmentManager fm = getActivity().getSupportFragmentManager(); 92 UiResultsFragment resultsView = new UiResultsFragment(); 93 String testName = BenchmarkRegistry.getBenchmarkName(v.getContext(), 94 mBenchmarks.get(position).id); 95 resultsView.setRunInfo(testName, mRunId); 96 FragmentTransaction fragmentTransaction = fm.beginTransaction(); 97 fragmentTransaction.replace(R.id.list_fragment_container, resultsView); 98 fragmentTransaction.addToBackStack(null); 99 fragmentTransaction.commit(); 100 } 101 } 102 } 103 104 105 private class LocalBenchmark { 106 int id; 107 int runCount = 0; 108 int totalCount = 0; 109 ArrayList<String> mResultsUri = new ArrayList<>(); 110 LocalBenchmark(int id, int runCount)111 LocalBenchmark(int id, int runCount) { 112 this.id = id; 113 this.runCount = 0; 114 this.totalCount = runCount; 115 } 116 117 } 118 119 @Override onCreate(Bundle savedInstanceState)120 protected void onCreate(Bundle savedInstanceState) { 121 super.onCreate(savedInstanceState); 122 setContentView(R.layout.activity_running_list); 123 124 initLocalBenchmarks(getIntent()); 125 126 if (findViewById(R.id.list_fragment_container) != null) { 127 FragmentManager fm = getSupportFragmentManager(); 128 LocalBenchmarksList listView = new LocalBenchmarksList(); 129 listView.setListAdapter(new LocalBenchmarksListAdapter(LayoutInflater.from(this))); 130 listView.setBenchmarks(mBenchmarksToRun); 131 listView.setRunId(mCurrentRunId); 132 fm.beginTransaction().add(R.id.list_fragment_container, listView).commit(); 133 } 134 135 TextView scoreView = (TextView) findViewById(R.id.score_text_view); 136 scoreView.setText("Running tests!"); 137 } 138 translateBenchmarkIndex(int index)139 private int translateBenchmarkIndex(int index) { 140 if (index >= 0 && index < ALL_TESTS.length) { 141 return ALL_TESTS[index]; 142 } 143 144 return -1; 145 } 146 initLocalBenchmarks(Intent intent)147 private void initLocalBenchmarks(Intent intent) { 148 mBenchmarksToRun = new ArrayList<>(); 149 int[] enabledIds = intent.getIntArrayExtra(BenchmarkGroup.BENCHMARK_EXTRA_ENABLED_TESTS); 150 int runCount = intent.getIntExtra(BenchmarkGroup.BENCHMARK_EXTRA_RUN_COUNT, RUN_COUNT); 151 mFinish = intent.getBooleanExtra(BenchmarkGroup.BENCHMARK_EXTRA_FINISH, false); 152 153 if (enabledIds == null) { 154 // run all tests 155 enabledIds = ALL_TESTS; 156 } 157 158 StringBuilder idString = new StringBuilder(); 159 idString.append(runCount); 160 idString.append(System.currentTimeMillis()); 161 162 for (int i = 0; i < enabledIds.length; i++) { 163 int id = enabledIds[i]; 164 System.out.println("considering " + id); 165 if (!isValidBenchmark(id)) { 166 System.out.println("not valid " + id); 167 id = translateBenchmarkIndex(id); 168 System.out.println("got out " + id); 169 System.out.println("expected: " + R.id.benchmark_overdraw); 170 } 171 172 if (isValidBenchmark(id)) { 173 int localRunCount = runCount; 174 if (isCompute(id)) { 175 localRunCount = 1; 176 } 177 mBenchmarksToRun.add(new LocalBenchmark(id, localRunCount)); 178 idString.append(id); 179 } 180 } 181 182 mBenchmarkCursor = 0; 183 mCurrentRunId = idString.toString().hashCode(); 184 } 185 isCompute(int id)186 private boolean isCompute(int id) { 187 switch (id) { 188 case R.id.benchmark_cpu_gflops: 189 case R.id.benchmark_cpu_heat_soak: 190 case R.id.benchmark_memory_bandwidth: 191 case R.id.benchmark_memory_latency: 192 case R.id.benchmark_power_management: 193 return true; 194 default: 195 return false; 196 } 197 } 198 isValidBenchmark(int benchmarkId)199 private static boolean isValidBenchmark(int benchmarkId) { 200 switch (benchmarkId) { 201 case R.id.benchmark_list_view_scroll: 202 case R.id.benchmark_image_list_view_scroll: 203 case R.id.benchmark_shadow_grid: 204 case R.id.benchmark_text_high_hitrate: 205 case R.id.benchmark_text_low_hitrate: 206 case R.id.benchmark_edit_text_input: 207 case R.id.benchmark_overdraw: 208 case R.id.benchmark_bitmap_upload: 209 case R.id.benchmark_memory_bandwidth: 210 case R.id.benchmark_memory_latency: 211 case R.id.benchmark_power_management: 212 case R.id.benchmark_cpu_heat_soak: 213 case R.id.benchmark_cpu_gflops: 214 return true; 215 default: 216 return false; 217 } 218 } 219 220 @Override onResume()221 protected void onResume() { 222 super.onResume(); 223 mHandler.postDelayed(new Runnable() { 224 @Override 225 public void run() { 226 runNextBenchmark(); 227 } 228 }, 1000); 229 } 230 computeOverallScore()231 private void computeOverallScore() { 232 final TextView scoreView = (TextView) findViewById(R.id.score_text_view); 233 scoreView.setText("Computing score..."); 234 new AsyncTask<Void, Void, Integer>() { 235 @Override 236 protected Integer doInBackground(Void... voids) { 237 GlobalResultsStore gsr = 238 GlobalResultsStore.getInstance(RunLocalBenchmarksActivity.this); 239 ArrayList<Double> testLevelScores = new ArrayList<>(); 240 final SummaryStatistics stats = new SummaryStatistics(); 241 for (LocalBenchmark b : mBenchmarksToRun) { 242 HashMap<String, ArrayList<UiBenchmarkResult>> detailedResults = 243 gsr.loadDetailedResults(mCurrentRunId); 244 for (ArrayList<UiBenchmarkResult> testResult : detailedResults.values()) { 245 for (UiBenchmarkResult res : testResult) { 246 int score = res.getScore(); 247 if (score == 0) { 248 score = 1; 249 } 250 stats.addValue(score); 251 } 252 253 testLevelScores.add(stats.getGeometricMean()); 254 stats.clear(); 255 } 256 257 } 258 259 for (double score : testLevelScores) { 260 stats.addValue(score); 261 } 262 263 return (int)Math.round(stats.getGeometricMean()); 264 } 265 266 @Override 267 protected void onPostExecute(Integer score) { 268 TextView view = (TextView) 269 RunLocalBenchmarksActivity.this.findViewById(R.id.score_text_view); 270 view.setText("Score: " + score); 271 } 272 }.execute(); 273 } 274 runNextBenchmark()275 private void runNextBenchmark() { 276 LocalBenchmark benchmark = mBenchmarksToRun.get(mBenchmarkCursor); 277 boolean runAgain = false; 278 279 if (benchmark.runCount < benchmark.totalCount) { 280 runBenchmarkForId(mBenchmarksToRun.get(mBenchmarkCursor).id, benchmark.runCount++); 281 } else if (mBenchmarkCursor + 1 < mBenchmarksToRun.size()) { 282 mBenchmarkCursor++; 283 benchmark = mBenchmarksToRun.get(mBenchmarkCursor); 284 runBenchmarkForId(benchmark.id, benchmark.runCount++); 285 } else if (runAgain) { 286 mBenchmarkCursor = 0; 287 initLocalBenchmarks(getIntent()); 288 289 runBenchmarkForId(mBenchmarksToRun.get(mBenchmarkCursor).id, benchmark.runCount); 290 } else if (mFinish) { 291 finish(); 292 } else { 293 Log.i("BENCH", "BenchmarkDone!"); 294 computeOverallScore(); 295 } 296 } 297 runBenchmarkForId(int id, int iteration)298 private void runBenchmarkForId(int id, int iteration) { 299 Intent intent; 300 int syntheticTestId = -1; 301 302 System.out.println("iteration: " + iteration); 303 304 switch (id) { 305 case R.id.benchmark_list_view_scroll: 306 intent = new Intent(getApplicationContext(), ListViewScrollActivity.class); 307 break; 308 case R.id.benchmark_image_list_view_scroll: 309 intent = new Intent(getApplicationContext(), ImageListViewScrollActivity.class); 310 break; 311 case R.id.benchmark_shadow_grid: 312 intent = new Intent(getApplicationContext(), ShadowGridActivity.class); 313 break; 314 case R.id.benchmark_text_high_hitrate: 315 intent = new Intent(getApplicationContext(), TextScrollActivity.class); 316 intent.putExtra(TextScrollActivity.EXTRA_HIT_RATE, 80); 317 intent.putExtra(BenchmarkRegistry.EXTRA_ID, id); 318 break; 319 case R.id.benchmark_text_low_hitrate: 320 intent = new Intent(getApplicationContext(), TextScrollActivity.class); 321 intent.putExtra(TextScrollActivity.EXTRA_HIT_RATE, 20); 322 intent.putExtra(BenchmarkRegistry.EXTRA_ID, id); 323 break; 324 case R.id.benchmark_edit_text_input: 325 intent = new Intent(getApplicationContext(), EditTextInputActivity.class); 326 break; 327 case R.id.benchmark_overdraw: 328 intent = new Intent(getApplicationContext(), FullScreenOverdrawActivity.class); 329 break; 330 case R.id.benchmark_bitmap_upload: 331 intent = new Intent(getApplicationContext(), BitmapUploadActivity.class); 332 break; 333 case R.id.benchmark_memory_bandwidth: 334 syntheticTestId = 0; 335 intent = new Intent(getApplicationContext(), MemoryActivity.class); 336 intent.putExtra("test", syntheticTestId); 337 break; 338 case R.id.benchmark_memory_latency: 339 syntheticTestId = 1; 340 intent = new Intent(getApplicationContext(), MemoryActivity.class); 341 intent.putExtra("test", syntheticTestId); 342 break; 343 case R.id.benchmark_power_management: 344 syntheticTestId = 2; 345 intent = new Intent(getApplicationContext(), MemoryActivity.class); 346 intent.putExtra("test", syntheticTestId); 347 break; 348 case R.id.benchmark_cpu_heat_soak: 349 syntheticTestId = 3; 350 intent = new Intent(getApplicationContext(), MemoryActivity.class); 351 intent.putExtra("test", syntheticTestId); 352 break; 353 case R.id.benchmark_cpu_gflops: 354 syntheticTestId = 4; 355 intent = new Intent(getApplicationContext(), MemoryActivity.class); 356 intent.putExtra("test", syntheticTestId); 357 break; 358 359 default: 360 intent = null; 361 } 362 363 if (intent != null) { 364 intent.putExtra("com.android.benchmark.RUN_ID", mCurrentRunId); 365 intent.putExtra("com.android.benchmark.ITERATION", iteration); 366 startActivityForResult(intent, id & 0xffff, null); 367 } 368 } 369 370 @Override onActivityResult(int requestCode, int resultCode, Intent data)371 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 372 switch (requestCode) { 373 case R.id.benchmark_shadow_grid: 374 case R.id.benchmark_list_view_scroll: 375 case R.id.benchmark_image_list_view_scroll: 376 case R.id.benchmark_text_high_hitrate: 377 case R.id.benchmark_text_low_hitrate: 378 case R.id.benchmark_edit_text_input: 379 break; 380 default: 381 } 382 } 383 384 class LocalBenchmarksListAdapter extends BaseAdapter { 385 386 private final LayoutInflater mInflater; 387 LocalBenchmarksListAdapter(LayoutInflater inflater)388 LocalBenchmarksListAdapter(LayoutInflater inflater) { 389 mInflater = inflater; 390 } 391 392 @Override getCount()393 public int getCount() { 394 return mBenchmarksToRun.size(); 395 } 396 397 @Override getItem(int i)398 public Object getItem(int i) { 399 return mBenchmarksToRun.get(i); 400 } 401 402 @Override getItemId(int i)403 public long getItemId(int i) { 404 return mBenchmarksToRun.get(i).id; 405 } 406 407 @Override getView(int i, View convertView, ViewGroup parent)408 public View getView(int i, View convertView, ViewGroup parent) { 409 if (convertView == null) { 410 convertView = mInflater.inflate(R.layout.running_benchmark_list_item, null); 411 } 412 413 TextView name = (TextView) convertView.findViewById(R.id.benchmark_name); 414 name.setText(BenchmarkRegistry.getBenchmarkName( 415 RunLocalBenchmarksActivity.this, mBenchmarksToRun.get(i).id)); 416 return convertView; 417 } 418 419 } 420 } 421