我需要通过设计一些实验来比较各种pthread结构(如互斥锁、信号量、读写锁以及相应的串行程序)的性能。主要问题是决定如何测量分析代码的执行时间?
我读过一些C函数,如clock()、gettimeofday()等。根据我的理解,我们可以使用clock()来获取程序使用的CPU周期的实际数量(通过减去由返回的值) gettimeofday() 返回程序执行的挂钟时间。
但问题是总 CPU 周期对我来说似乎不是一个好的标准,因为它将所有并行运行的线程所花费的 CPU 时间相加(所以对我来说,clock() 并不好)。另外,挂钟时间也不好,因为可能有其他进程在后台运行,所以时间最终取决于线程的调度方式(所以对我来说 gettimeofday() 也不好)。
据我所知,其他一些功能也很可能与上述两个功能相同。所以,我想知道是否有一些函数可以用于我的分析,或者我在上面的结论中是否有错误?
最佳答案
CLOCK_PROCESS_CPUTIME_ID (since Linux 2.6.12)
Per-process CPU-time clock (measures CPU time consumed by all
threads in the process).
CLOCK_THREAD_CPUTIME_ID (since Linux 2.6.12)
Thread-specific CPU-time clock.
我相信clock()
在某个地方被实现为clock_gettime(CLOCK_PROCESS_CPUTIME_ID
),但我看到它是在glibc中使用times()
实现的。
因此,如果您想测量特定于线程的 CPU 时间,可以在 GNU/Linux 系统上使用 clock_gettimer(CLOCK_THREAD_CPUTIME_ID, ...
)。
永远不要使用 gettimeofday
或 clock_gettime(CLOCK_REALTIME
) 来测量程序的执行情况。想都别想。gettimeofday
是“挂钟” - 您可以将其显示在房间的墙上。如果您想测量时间的流逝,请忘记gettimeofday
。
如果你愿意,你甚至可以通过使用pthread_getcpuclockid
来保持完全的posixly兼容。在您的线程内并使用它返回的 clock_id
值和 clock_gettime
。
关于比较各种 pthread 结构的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55450373/