如何在NDK中获得计算时间

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

我读过这个问题: Android获取当前时间戳?

我想我可以通过这种方式使用相同的方法获得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); 

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

Solutions Collecting From Web of "如何在NDK中获得计算时间"

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

使用单调时钟代替性能测量 – 具有CLOCK_MONOTONIC System.nanoTime ()或clock_gettime() 。 注意这返回一个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时间感兴趣; 请参阅Android中的线程性能 。

从您的C / C ++代码中,

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

这将在几秒钟和几微秒内为您提供当前时间的结构,使您足够轻松地在两点之间测量时间。 然后执行转换以返回当前时间,以毫秒为单位。

编辑:更新每@ ChrisStratton的build议。