2013-06-19 56 views
9

我需要獲取用NDK/JNI在C中實現的算法的某些部分的計算時間。如何在NDK中獲得計算時間

我讀過這樣一個問題:Android Get Current timestamp?

我想我可以用同樣的方法以這種方式獲得JNI調用的計算時間:

Long start, end, time; 
start = System.currentTimeMillis()/1000; 
//my native call 
end = System.currentTimeMillis()/1000; 
time = end - start; 
Log.i(TAG, "Time ... (ms): " + time); 

但我需要檢查的計算本地方法中的一些小部分的次數。我該怎麼做?

+0

你可以通過在調用方法之前和之後設置日誌消息來完成它,然後使用time = end - start;我的意思是在日誌消息中打印時間。 – TheFlash

+0

@AllessandroGaietta您的示例將'currentTimeMillis()'分隔了1000倍......您是否希望您的測量結果與秒一樣? – mah

+0

@mah這是一個複製錯誤,我不想劃分1000; D –

回答

7

從C/C++代碼中,

#include <sys/time.h> 
long long currentTimeInMilliseconds() 
{ 
    struct timeval tv; 
    gettimeofday(&tv, NULL); 
    return ((tv.tv_sec * 1000) + (tv.tv_usec/1000)); 
} 

這將讓你的結構,在秒和毫秒當前時間,給你足夠的非常輕鬆地測量兩點之間的時間。然後它執行轉換以返回當前時間,以毫秒爲單位。

編輯:per @ ChrisStratton的建議。

+0

這將是一個更完整的答案,如果你顯示從結構轉換爲64位類型的單個毫秒或微秒值... –

+0

@ChrisStratton很好的建議;編輯。 – mah

+1

我有litle問題類型添加到數字例如。 struct timeval stCurrentTime; gettimeofday(&stCurrentTime,nullptr); return((long long)stCurrentTime.tv_sec * 1000L)+((long long)stCurrentTime.tv_usec/1000L); //毫秒 –

12

最好不要在移動設備上使用gettimeofday()currentTimeMillis()。這些返回的「掛鐘」時間,如果網絡更新時間,它可以突然前進或後退。

使用單調時鐘代替性能測量 - System.nanoTime()或clock_gettime()CLOCK_MONOTONIC。請注意,這將返回struct timespec而不是struct timeval;主要區別在於時鐘分辨率是納秒而不是微秒。

int64_t getTimeNsec() { 
    struct timespec now; 
    clock_gettime(CLOCK_MONOTONIC, &now); 
    return (int64_t) now.tv_sec*1000000000LL + now.tv_nsec; 
} 

除了掛鐘時間,您可能會對每個線程的CPU時間感興趣;見Thread Performance in Android

+0

更新掛鐘時間的頻率是多少?我在gettimeofday()和clock_gettime(CLOCK_PROCESS_CPUTIME_ID)方法之間獲得了非常不同的時間值。第二個似乎更穩定,但結果是第一個時間更長,而我預計時間更短! –

+1

您可以通過在循環中儘可能快地調用掛鐘計時器來更新壁掛計時器的更新頻率,並在第一次更改值時減去結果。它隨着設備的不同而不同,也不同。 PROCESS_CPUTIME時鐘僅在您的進程工作時纔會進行;如果它睡着了,時鐘不會改變。 (我建議CLOCK_THREAD_CPUTIME_ID用於性能工作,因爲它只在當前線程使用CPU時纔會提前。)時鐘不相互關聯,可能不會從零開始。 – fadden

+0

我的意思是通過使用clock_gettime(CLOCK_PROCESS_CPUTIME_ID)(或THREAD,相同的結果)對一小組操作(幾毫秒)進行測量,我得到的時間等於gettimeofday()或一個簡單的時鐘()。相反,在漫長的週期中,我會用gettimeofday()和clock()來獲得更長的時間,而獲得更長的時間。注意:在所有情況下,我測量的是終點和起點之間的時間,如果納秒差異<0(秒++),則會更正clock_gettime()的結果。 clock()被翻譯除以CLOCKS_PER_SEC。 –