比较各种 pthread 结构的性能

标签 c performance parallel-processing pthreads execution-time

我需要通过设计一些实验来比较各种pthread结构(如互斥锁、信号量、读写锁以及相应的串行程序)的性能。主要问题是决定如何测量分析代码的执行时间?

我读过一些C函数,如clock()、gettimeofday()等。根据我的理解,我们可以使用clock()来获取程序使用的CPU周期的实际数量(通过减去由返回的值) gettimeofday() 返回程序执行的挂钟时间。

但问题是总 CPU 周期对我来说似乎不是一个好的标准,因为它将所有并行运行的线程所花费的 CPU 时间相加(所以对我来说,clock() 并不好)。另外,挂钟时间也不好,因为可能有其他进程在后台运行,所以时间最终取决于线程的调度方式(所以对我来说 gettimeofday() 也不好)。

据我所知,其他一些功能也很可能与上述两个功能相同。所以,我想知道是否有一些函数可以用于我的分析,或者我在上面的结论中是否有错误?

最佳答案

来自linux clock_gettime :

   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, ...)。

永远不要使用 gettimeofdayclock_gettime(CLOCK_REALTIME) 来测量程序的执行情况。想都别想。gettimeofday 是“挂钟” - 您可以将其显示在房间的墙上。如果您想测量时间的流逝,请忘记gettimeofday

如果你愿意,你甚至可以通过使用pthread_getcpuclockid来保持完全的posixly兼容。在您的线程内并使用它返回的 clock_id 值和 clock_gettime

关于比较各种 pthread 结构的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55450373/

相关文章:

c - 从自定义命令(Tcl_CmdProc)调用其他Tcl命令

arrays - 如何使用 CUDA 将多个线程映射到不同元素具有不同线程数的数组元素?

c# - 如何使用 Parallel.For/ForEach 获得最佳性能? (包括表演时间)

c# - 什么会导致应用程序的 RAM 使用率线性增长?

algorithm - 提高模块效率

css - SVG 渐变有利于 CSS 渐变

c# - 具有返回值和异步/等待的并行执行

c - 为什么不可分派(dispatch)句柄在 64 位平台上使用 ptr?

C 宏传递数字而不是变量

c - 将文件读入结构数组后出现段错误