1、概述
性能測試在Java層和Native層的驗證是一個常用操作,在精度要求在ms量級情況下java層可以使用System.currentTimeMillis()或者SystemClock.elapsedRealtime()(推薦使用),在Nativce層可以使用gettimeofday和clock_gettime進行驗證。
(注意:驗證過程中都沒有考慮方法本身的調用耗時,在精度要求爲ms量級情況下基本能滿足要求。)
2、使用方法
- Java層使用簡單,推薦使用SystemClock.elapsedRealtime(),原因和使用方法不進行贅述
- Native層使用
使用gettimeofday進行驗證
long long timeCost = 0;
struct timeval startTimestamp, endTimestamp;
gettimeofday(&startTimestamp, NULL);
//Funtion Code to be tested
gettimeofday(&endTimestamp, NULL);
timeCost += (endTimestamp.tv_sec - startTimestamp.tv_sec) * 1000000ll + (endTimestamp.tv_usec - startTimestamp.tv_usec);
__android_log_print(ANDROID_LOG_DEBUG, "PerfTest","function consumes:%lld us", timeCost); //注意一定是%lld
使用clock_gettime進行驗證
long long timeCost = 0;
struct timespec startTimeSpec, endTimeSpec;
clock_gettime(CLOCK_MONOTONIC, &startTimeSpec);
//Funtion Code to be tested
clock_gettime(CLOCK_MONOTONIC, &endTimeSpec);
timeCost += (endTimeSpec.tv_sec - startTimeSpec.tv_sec) * 1000000000LL + (endTimeSpec.tv_nsec - startTimeSpec.tv_nsec);
__android_log_print(ANDROID_LOG_DEBUG, "PerfTest","function consumes:%lld ns", timeCost); //注意一定是%lld
3、注意事項
- 兩種方法進行耗時打印時都應該使用%lld打印long long類型數值;
- clock_gettime的第一個參數可以爲如下參數:
CLOCK_REALTIME(系統實時時間,隨系統實時時間改變而改變,中間時刻如果系統時間被用戶改動,則對應的時間相應改變);
CLOCK_MONOTONIC(從系統啓動開始計時,不受系統時間被用戶改變的影響,推薦使用);
CLOCK_PROCESS_CPUTIME_ID(系統CPU從本進程到當前代碼花費的時間);
CLOCK_THREAD_CPUTIME_ID(系統CPU從本線程到當前代碼花費的時間)