1. 程式人生 > >Android效能測試工具:磁碟資源

Android效能測試工具:磁碟資源

最近小V面試,發現大家對android效能測試工具還是有許多不知道的, 我在這裡拓展大夥的思路吧。

我們通常把效能測試工具,按照使用目的和測試型別類分類。這裡小V打算從測試型別開始說,可能會更加符合大家的邏輯。

資源類效能測試工具

我們先說資源類的效能測試工具吧。 


磁碟資源

關於磁碟資源,我們可以理解成空間和IO兩個型別的資源。

空間資源

df指令

可以用busybox的df指令或者自帶的df獲取,當然busybox的df指令更加好,資訊更加詳細。使用方法很簡單,adb shell df   就OK. 

詳見:http://blog.csdn.net/conowen/article/details/7262735

呼叫私有API:getPackageSizeInfo

詳見:http://www.baidufe.com/item/8786bc2e95a042320bef.html

dumpsys diskstats指令

Latency: 5ms [512B Data Write]

Data-Free: 362888K / 1161104K total = 31% free

Cache-Free: 116756
K / 120900K total = 96% free

System-Free: 133036K / 806284K total = 16% free

dumpsys devicestoragemonitor
   @Override
    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
                != PackageManager.PERMISSION_GRANTED) {

            pw.println("Permission Denial: can't dump " + SERVICE + " from from pid="
                    + Binder.getCallingPid()
                    + ", uid=" + Binder.getCallingUid());
            return;
        }

        pw.println("Current DeviceStorageMonitor state:");
        pw.print("  mFreeMem="); pw.print(Formatter.formatFileSize(mContext, mFreeMem));
                pw.print(" mTotalMemory=");
                pw.println(Formatter.formatFileSize(mContext, mTotalMemory));
        pw.print("  mFreeMemAfterLastCacheClear=");
                pw.println(Formatter.formatFileSize(mContext, mFreeMemAfterLastCacheClear));
        pw.print("  mLastReportedFreeMem=");
                pw.print(Formatter.formatFileSize(mContext, mLastReportedFreeMem));
                pw.print(" mLastReportedFreeMemTime=");
                TimeUtils.formatDuration(mLastReportedFreeMemTime, SystemClock.elapsedRealtime(), pw);
                pw.println();
        pw.print("  mLowMemFlag="); pw.print(mLowMemFlag);
                pw.print(" mMemFullFlag="); pw.println(mMemFullFlag);
        pw.print("  mClearSucceeded="); pw.print(mClearSucceeded);
                pw.print(" mClearingCache="); pw.println(mClearingCache);
        pw.print("  mMemLowThreshold=");
                pw.print(Formatter.formatFileSize(mContext, mMemLowThreshold));
                pw.print(" mMemFullThreshold=");
                pw.println(Formatter.formatFileSize(mContext, mMemFullThreshold));
        pw.print("  mMemCacheStartTrimThreshold=");
                pw.print(Formatter.formatFileSize(mContext, mMemCacheStartTrimThreshold));
                pw.print(" mMemCacheTrimToThreshold=");
                pw.println(Formatter.formatFileSize(mContext, mMemCacheTrimToThreshold));
    }

DISK IO資源

StrictMode 

可以分析到許多DISK IO在主執行緒耗時的情況。之前就遇到過sharepreference 在主執行緒呼叫commit,在主執行緒耗時800ms以上。解決方法有麼?可以用apply,這個相對來說是一個非同步的commit方法。

dumpsys dbinfo [pkgname]

eg:dumpsys dbinfo com.qzone   可以分析sqlite的耗時

Connection pool for /data/data/com.qzone/databases/cfcd208495d565ef66e7dff9f98764da:
  Open: true
  Max connections: 1
  Available primary connection:
    Connection #0:
      isPrimaryConnection: true
      onlyAllowReadOnlyOperations: true
      Most recently executed operations:
        0: [2014-03-29 19:56:49.831] executeForCursorWindow took 0ms - succeeded, sql="SELECT * FROM QzoneUser"
        1: [2014-03-29 19:56:49.830] prepare took 0ms - succeeded, sql="SELECT * FROM QzoneUser"
        2: [2014-03-29 19:56:49.808] execute took 20ms - succeeded, sql="COMMIT;"
        3: [2014-03-29 19:56:49.807] executeForLastInsertedRowId took 1ms - succeeded, sql="INSERT OR REPLACE INTO Qzone
User(account,uin,nickName,vipType,vipLevel) VALUES (?,?,?,?,?)", bindArgs=["189272879", 189272879, "澶╁ぉ鐖辨櫞澶?, 0,
7]
        4: [2014-03-29 19:56:49.805] execute took 2ms - succeeded, sql="BEGIN EXCLUSIVE;"
        5: [2014-03-29 19:55:20.223] executeForCursorWindow took 0ms - succeeded, sql="SELECT * FROM QzoneUser"
        6: [2014-03-29 19:55:20.222] prepare took 1ms - succeeded, sql="SELECT * FROM QzoneUser"
        7: [2014-03-29 19:55:20.206] execute took 16ms - succeeded, sql="COMMIT;"
        8: [2014-03-29 19:55:20.205] executeForLastInsertedRowId took 1ms - succeeded, sql="INSERT OR REPLACE INTO Qzone
User(account,uin,nickName,vipType,vipLevel) VALUES (?,?,?,?,?)", bindArgs=["189272879", 189272879, "澶╁ぉ鐖辨櫞澶?, 0,
7]
        9: [2014-03-29 19:55:20.205] execute took 0ms - succeeded, sql="BEGIN EXCLUSIVE;"
        10: [2014-03-29 19:55:17.819] executeForCursorWindow took 0ms - succeeded, sql="SELECT * FROM QzoneUser"
        11: [2014-03-29 19:55:17.818] prepare took 0ms - succeeded, sql="SELECT * FROM QzoneUser"
        12: [2014-03-29 19:55:17.805] execute took 13ms - succeeded, sql="COMMIT;"
        13: [2014-03-29 19:55:17.805] executeForLastInsertedRowId took 0ms - succeeded, sql="INSERT OR REPLACE INTO Qzon
eUser(account,uin,nickName,vipType,vipLevel) VALUES (?,?,?,?,?)", bindArgs=["189272879", 189272879, "澶╁ぉ鐖辨櫞澶?, 0,
 7]
        14: [2014-03-29 19:55:17.805] execute took 0ms - succeeded, sql="BEGIN EXCLUSIVE;"
        15: [2014-03-29 19:55:16.373] executeForCursorWindow took 1ms - succeeded, sql="SELECT * FROM cover WHERE uin='1
89272879'"
        16: [2014-03-29 19:55:16.373] prepare took 0ms - succeeded, sql="SELECT * FROM cover WHERE uin='189272879'"
        17: [2014-03-29 19:55:16.350] execute took 22ms - succeeded, sql="COMMIT;"
        18: [2014-03-29 19:55:16.350] executeForLastInsertedRowId took 0ms - succeeded, sql="INSERT OR REPLACE INTO cove
r(uin,data) VALUES (?,?)", bindArgs=[189272879, <byte[]>]
        19: [2014-03-29 19:55:16.350] prepare took 0ms - succeeded, sql="INSERT OR REPLACE INTO cover(uin,data) VALUES (
?,?)"
  Available non-primary connections:
    <none>
  Acquired connections:
    <none>
  Connection waiters:
    <none>