17ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong/* 27ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Copyright (C) 2015 The Android Open Source Project 37ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * 47ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Licensed under the Apache License, Version 2.0 (the "License"); 57ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * you may not use this file except in compliance with the License. 67ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * You may obtain a copy of the License at 77ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * 87ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * http://www.apache.org/licenses/LICENSE-2.0 97ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * 107ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Unless required by applicable law or agreed to in writing, software 117ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * distributed under the License is distributed on an "AS IS" BASIS, 127ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * See the License for the specific language governing permissions and 147ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * limitations under the License 157ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong */ 167ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 177ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tongpackage android.net; 187ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 1976a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinimport com.google.caliper.BeforeExperiment; 207ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tongimport com.google.caliper.Param; 217ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 2276a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffinpublic class NetworkStatsBenchmark { 237ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong private static final String UNDERLYING_IFACE = "wlan0"; 247ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong private static final String TUN_IFACE = "tun0"; 257ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong private static final int TUN_UID = 999999999; 267ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 277ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong @Param({"100", "1000"}) 287ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong private int mSize; 297ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong private NetworkStats mNetworkStats; 307ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 3176a6cec97f48435863b6ab360e11f5da26d7956bPaul Duffin @BeforeExperiment 327ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong protected void setUp() throws Exception { 337ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong mNetworkStats = new NetworkStats(0, mSize + 2); 347ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong int uid = 0; 357ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong NetworkStats.Entry recycle = new NetworkStats.Entry(); 367ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong for (int i = 0; i < mSize; i++) { 377ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.iface = (i < mSize / 2) ? TUN_IFACE : UNDERLYING_IFACE; 387ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.uid = uid; 397ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.set = i % 2; 407ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.tag = NetworkStats.TAG_NONE; 417ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.rxBytes = 60000; 427ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.rxPackets = 60; 437ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.txBytes = 150000; 447ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.txPackets = 1500; 457ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.operations = 0; 467ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong mNetworkStats.addValues(recycle); 477ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong if (recycle.set == 1) { 487ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong uid++; 497ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 507ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 517ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.iface = UNDERLYING_IFACE; 527ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.uid = TUN_UID; 537ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.set = NetworkStats.SET_FOREGROUND; 547ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.tag = NetworkStats.TAG_NONE; 557ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.rxBytes = 90000 * mSize; 567ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.rxPackets = 40 * mSize; 577ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.txBytes = 180000 * mSize; 587ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.txPackets = 1200 * mSize; 597ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong recycle.operations = 0; 607ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong mNetworkStats.addValues(recycle); 617ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 627ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 637ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong public void timeMigrateTun(int reps) { 647ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong for (int i = 0; i < reps; i++) { 657ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong NetworkStats stats = mNetworkStats.clone(); 667ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong stats.migrateTun(TUN_UID, TUN_IFACE, UNDERLYING_IFACE); 677ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 687ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 697ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong 707ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong /** 717ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * Since timeMigrateTun() includes a clone() call on the NetworkStats object, 727ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * we need to measure the cost of the clone() call itself in order to get more 737ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong * accurate measurement on the migrateTun() method. 747ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong */ 757ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong public void timeClone(int reps) { 767ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong for (int i = 0; i < reps; i++) { 777ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong NetworkStats stats = mNetworkStats.clone(); 787ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 797ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong } 807ae35a0242abf2091fb226aae19160a46135a5d8Wenchao Tong} 81