c - 配置文件时间与 clock() 时间无关

标签 c profiling performance

我在 Linux 上使用 C,并希望针对不同的输入大小计算我的​​代码的性能。该代码是用于求解 PDE 的数值方法,我有可靠的基础来预测代码的执行时间。

我遇到的问题是记录特定问题的计时结果。对于我遇到的所有问题,除了一个问题,使用 clock() 获取开始和结束时间给出了我期望的时间。也就是说,如果大小为 N 的输入花费时间 T,那么大小为 4N 的输入将花费时间 4T。对于一个问题,情况并非如此(打开和不打开优化标志)。为了弄清楚发生了什么,我使用分析器 (gprof) 运行了代码,在这种情况下,分析器告诉我代码需要一些时间来执行,这与 clock() 时间相去甚远给出。下面显示的结果是gprof中给出的时间,使用clock()的时间是在不带-gp的情况下重新编译相同代码时给出的。作为健全性检查,所有代码都在未设置任何优化标志的情况下编译

   Input size   |   Time (clock())   |   Time (gprof)
     256x256    |       122.77       |       32.14
     512x512    |       538.94       |      128.37
    1024x1024   |      2712.67       |      511.22

我使用 gprof 得到的缩放是我想要的,但是当我在没有任何分析的情况下执行代码时,代码本身的执行时间(挂钟时间)与打开分析时(这是非常奇怪)并且缩放比例不再是预期的因子 4。是否有关于为什么会这样的解释?

对于上面给出的结果,我认为唯一不同的是我广泛使用了具有小数幂的 pow() 函数,据一些研究表明它运行速度非常慢。但是,我希望减速是均匀的,这样时间的缩放应该仍然是均匀的。请注意,我没有使用文件 I/O 并且向控制台输出的输出很少,因此在程序可能会挂起很长时间的地方应该没有任何输出

最佳答案

gprof 做的是每秒对程序计数器采样 100 次,每次看它能不能找出程序计数器在哪个函数中。 (它还会跟踪任何函数调用任何其他函数的次数。) 但它对使用 -pg 编译的函数执行此操作。

假设程序计数器在数学库中,因为那是你调用的,但数学库不是用 -pg 编译的。 gprof 基本上会丢弃样本。

看,gprof 是一个受人尊敬的工具,但 stackoverflow 充满了试图理解它的问题。 除了不调用任何库函数、不执行递归和不执行任何 I/O 的程序(即玩具程序)外,不要指望从中得到任何类似精确测量的东西。

测量执行时间的最佳方法就是您执行它的方式 - 简单的总体计时。 如果你想要更多位数的精度,只需重复执行N次并除以N。

另一方面,如果您想查看函数或代码行花费了多少时间部分,包括仅程序计数器(独占或自身时间)和包括被调用者(包括在内)时间)你需要得到堆栈样本。 (因为包含分数 = 堆栈上的时间分数,而独占分数 = 堆栈结束的时间分数。) 一些分析器会这样做。许多人只是do it manually如果他们满足于低精度。 如果执行过程可能包括对诸如 sleep 、互斥等待或 I/O 等阻塞函数的调用,而您不希望将其排除在外,则需要在挂钟时间采集样本。 Very few profilers这样做,但显然手动方法可以做到这一点。

关于c - 配置文件时间与 clock() 时间无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626065/

相关文章:

在 C 中创建具有预定义长度的字符串数组

c - mlockall 的这种用法正确吗?

为32位cpu编译Linux内核模块

c - 何时将指针参数传递给函数

python - 如何使用 Python 分析器获取调用树?

java - 如何使用 visualvm 分析应用程序启动

c++ - linux性能: how to interpret and find hotspots

javascript - HTML5 <video> 标签性能

c++ - 如何快速将元素重复插入到排序列表中

javascript - 由于 typer.js,网站不断抖动