【问题标题】:How to obtain computation time in NDK如何在 NDK 中获取计算时间
【发布时间】:2013-06-15 20:11:29
【问题描述】:

我需要获取我在 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);

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

【问题讨论】:

  • 你可以通过在调用方法之前和之后设置日志消息来做到这一点......然后只需使用 time = end - start;我的意思是在日志消息中打印时间。
  • @AllessandroGaietta 您的示例将 currentTimeMillis() 除以 1000...您是否希望您的测量过程像秒一样?
  • @mah 这是一个复制错误,我不想除以 1000 ;D
  • @Pratik 显然在示例中有日志打印。我想知道如何在 JNI 调用中使用一些类似的函数来获取当前时间并将其打印在日志中(我知道如何在 JNI 中打印日志消息,只是不知道如何获取时间)。

标签: android performance time android-ndk java-native-interface


【解决方案1】:

在您的 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 的建议更新。

【讨论】:

  • 如果您展示了从 struct 到 64 位类型的单个毫秒或微秒值的转换,这将是一个更完整的答案...
  • 我对类型添加 L 到数字有一点问题,例如。 struct timeval stCurrentTime; gettimeofday(&stCurrentTime, nullptr);返回 ((long long)stCurrentTime.tv_sec * 1000L) + ((long long)stCurrentTime.tv_usec / 1000L); //毫秒
【解决方案2】:

最好不要在移动设备上使用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

【讨论】:

  • 挂钟时间多久更新一次?我在 gettimeofday() 和 clock_gettime(CLOCK_PROCESS_CPUTIME_ID) 方法之间获得了非常不同的时间值。第二个似乎更稳定,但结果是比第一个更长的时间,而不是我期望的更短的时间!
  • 您可以通过在循环中尽可能快地调用它并在值第一次更改时减去结果来判断挂钟计时器的更新频率。它因设备和版本而异。 PROCESS_CPUTIME 时钟仅在您的进程正常工作时才前进;如果它睡着了,时钟不会改变。 (我建议 CLOCK_THREAD_CPUTIME_ID 用于性能工作,因为它仅在当前线程使用 CPU 时才会前进。)时钟彼此不相关,并且可能不会从零开始。
  • 我的意思是,通过使用 clock_gettime(CLOCK_PROCESS_CPUTIME_ID) (或 THREAD,相同的结果)对一小组操作(几毫秒)进行测量,我得到的时间等于 gettimeofday() 或一个简单的钟()。相反,在较长的周期中,第一个周期的时间更长,而 gettimeofday() 和 clock() 的时间相同,时间更短。注意:在所有情况下,我都会测量终点和起点之间的时间,如果纳秒差
  • 进程/线程 cpu 时间是否包括处理器代表程序执行内核空间指令的时间?还是被排除在外?
猜你喜欢
  • 2021-12-06
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多