• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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