Home | History | Annotate | Download | only in app
      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