11

我需要获取我在 C 中使用 NDK/JNI 实现的算法的某些部分的计算时间。

我读过这个问题: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);

但是我需要检查原生方法中一些小部分的计算时间。我该怎么做?

4

2 回答 2

16

最好不要在移动设备上使用gettimeofday()或使用。currentTimeMillis()这些返回“挂钟”时间,如果网络更新时间,它可以突然向前或向后跳跃。

使用单调时钟代替性能测量 - System.nanoTime() 或clock_gettime()with CLOCK_MONOTONIC。请注意,这会返回 astruct timespec而不是 a struct timeval; 主要区别在于时钟分辨率是纳秒而不是微秒。

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

除了挂钟时间,您可能对每线程 CPU 时间感兴趣;请参阅Android 中的线程性能

于 2013-06-20T14:47:54.393 回答
7

From within your C/C++ code,

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

This will get you a structure with the current time in seconds and microseconds, giving you enough to measure time between two points fairly easily. It then performs the conversion to return the current time, in milliseconds.

Edit: updated per @ChrisStratton's suggestion.

于 2013-06-19T18:59:02.487 回答