gprof 的替代品 [关闭]

2023-12-03

还有哪些程序可以与 gprof 做同样的事情?


gprof (阅读论文)存在是有历史原因的。 如果您认为它会帮助您发现性能问题,那么它从未被宣传过。 论文是这样说的:

该概况可用于比较和评估成本 各种实施。

它并没有说它可以用来identify需要评估的各种实施方式,尽管它确实imply在特殊情况下它可以:

特别是如果发现程序的一小部分占据主导地位 执行时间处理时间。

那些不那么局部化的问题怎么办? 那些不重要吗? 不要寄予期望gprof从未有人为此索赔过。 这是only一种测量工具,并且仅适用于 CPU 密集型操作。

试试这个吧。
下面是 44 倍加速的示例。
这是 730 倍的加速。
这是一个 8 分钟的视频演示。
这是统计数据的解释。
这是对批评的回应。

有一个关于程序的简单观察。在给定的执行中,每条指令只占总时间的一部分(尤其是call说明),从某种意义上说,如果没有它,就不会花时间。在此期间,指令位于堆栈上**。当你理解了这一点后,你就会发现——

gprof体现了某些关于性能的神话,例如:

  1. 程序计数器采样很有用。
    仅当您有不必要的热点瓶颈(例如大标量值数组的冒泡排序)时,它才有用。例如,一旦您将其更改为使用字符串比较的排序,它仍然是瓶颈,但程序计数器采样不会看到它,因为现在热点位于字符串比较中。另一方面,如果要采样extended程序计数器(调用堆栈)、调用字符串比较的点、排序循环都清晰显示。实际上,gprof是弥补仅 PC 采样的局限性的尝试。

  2. 计时功能比捕获耗时的代码行更重要。
    这个神话的原因是gprof无法捕获堆栈样本,因此它对函数进行计时,计算它们的调用次数,并尝试捕获调用图。然而,一旦识别出一个代价高昂的函数,您仍然需要在其内部查找负责该时间的行。如果有堆栈样本,您不需要查看,这些行将位于样本上。 (一个典型的函数可能有 100 - 1000 条指令。一个函数call是 1 条指令,因此定位昂贵调用的精度要高 2-3 个数量级。)

  3. 调用图很重要。
    关于程序你需要了解的不是where它花费了时间,但是why。当它在函数中花费时间时,堆栈上的每一行代码都给出了它为何存在的推理链中的一个链接。如果您只能看到堆栈的一部分,那么您只能看到部分原因,因此您无法确定该时间是否确实必要。 调用图告诉你什么?每条弧线都告诉您某个函数 A 在某个时间段内正在调用某个函数 B。即使 A 只有一行这样的代码调用 B,该行也只给出了一小部分原因。如果你足够幸运,也许这条线有一个糟糕的理由。通常,您需要同时查看多条线路才能找到不良原因(如果存在)。如果 A 在多个地方调用 B,那么它告诉你的信息就更少了。

  4. 递归是一个棘手且令人困惑的问题。
    那只是因为gprof其他分析器认为需要生成调用图,然后将时间归因于节点。如果有堆栈样本,则样本上出现的每一行代码的时间成本是一个非常简单的数字 - 它所在样本的分数。如果存在递归,则给定的行可以在样本上出现多次。不管。假设每 N 毫秒采样一次,并且该线出现在其中 F% 上(单独或单独)。如果该行可以不花时间(例如删除它或围绕它分支),那么这些样本将消失,时间会减少F%。

  5. 时间测量的准确性(因此大量样本)很重要。
    想一想。如果一行代码出现在 5 个样本中的 3 个上,那么如果您可以像灯泡一样将其射出,则所用时间大约会减少 60%。现在,您知道,如果您采集了 5 个不同的样本,您可能只会看到 2 次,或者最多 4 次。因此 60% 的测量值更像是 40% 到 80% 的一般范围。如果只有40%,你会说这个问题不值得解决吗?那么,当您真正想要的是时,时间准确性有什么意义呢?找到问题? 500 或 5000 个样本可以更精确地测量问题,但无法更准确地发现问题。

  6. 语句或函数调用的计数很有用。
    假设您知道某个函数已被调用 1000 次。你能从中看出它花费了多少时间吗?您还需要知道平均运行需要多长时间,将其乘以计数,然后除以总时间。平均调用时间可能从纳秒到秒不等,因此仅计数并不能说明太多问题。如果存在堆栈样本,则例程或任何语句的成本只是其所在样本的分数。如果例程或语句可以不花时间,原则上可以节省这部分时间,因此这与性能有最直接的关系。

  7. 封锁时无需取样
    造成这种误解的原因有两个:1)当程序等待时,PC 采样毫无意义;2)过分关注计时的准确性。然而,对于 (1),程序很可能正在等待它所请求的某些内容,例如文件 I/O,您可以需要知道,以及堆栈样本揭示的内容。 (显然,您希望在等待用户输入时排除样本。)对于(2),如果程序只是因为与其他进程竞争而等待,那么在运行时这可能会以相当随机的方式发生。 因此,虽然程序可能需要更长的时间,但这不会对重要的统计数据(语句在堆栈上的时间百分比)产生很大影响。

  8. “自我时间”很重要
    仅当您在函数级别而不是线路级别进行测量时,自时间才有意义,并且您认为需要帮助来辨别函数时间是否进入纯粹的本地计算与调用的例程。如果在行级别进行汇总,则一行如果位于堆栈末尾则表示自身时间,否则表示包含时间。无论哪种方式,它的成本都是它所在的堆栈样本的百分比,因此无论哪种情况都可以为您找到它。

  9. 必须以高频率取样
    这是因为性能问题可能会快速发生,并且样本必须频繁才能解决。但是,如果问题的成本是 10 秒(或其他)总运行时间中的 20%,那么无论问题是否发生,总时间内的每个样本都有 20% 的机会命中它像这样的单件
    .....XXXXXXXX...........................
    .^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^(20 个样本,4 个命中)
    或者像这样分成许多小块
    X...X...X.X..X.........X.....X....X.....
    .^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^(20 个样本,3 个命中)
    无论哪种方式,无论采样多少样本,命中次数平均约为五分之一。 (平均值 = 20 * 0.2 = 4。标准差 = +/- sqrt(20 * 0.2 * 0.8) = 1.8。)

  10. 你正在寻找的the瓶颈
    就好像只有一个一样。考虑以下执行时间表:vxvWvzvWvxvWvYvWvxvWv.vWvxvWvYvW
    它由真正有用的工作组成,代表为.。存在性能问题vWxYz分别花费 1/2、1/4、1/8、1/16、1/32 的时间。抽样发现v容易地。它被删除,留下
    xWzWxWYWxW.WxWYW
    现在程序的运行时间减少了一半,现在W花费一半的时间,并且很容易找到。它被删除,留下
    xzxYx.xY
    此过程持续进行,每次都会消除按百分比计算的最大性能问题,直到找不到任何可消除的问题。现在唯一执行的是.,其执行时间是原始程序的 1/32。这是放大效应,通过消除任何问题会使余数更大(按百分比计算),因为分母减少了。
    另一个关键点是必须找到每一个问题- 5个都没有遗漏。任何未发现和修复的问题都会严重降低最终的加速比。仅仅找到一些,但不是全部,还不够“足够好”。

补充:我只想指出一个原因gprof很受欢迎 - 正在被教导, 大概是因为它是免费的,易于教学,而且已经存在很长时间了。 快速谷歌搜索可以找到一些教授(或似乎教授)的学术机构:

伯克利分校克莱姆森分校 科罗拉多州 厄勒姆公爵 佛罗里达州立大学 印第安纳州 密西根州立大学 NCSA. 伊利诺伊州 NCSU 纽约大学 或 普林斯顿大学 PSU 斯坦福大学 UCSD UMD UMICH 犹他州 UTEXAS UTK Wustl

** 除了请求完成工作的其他方式外,不会留下任何痕迹why,例如通过消息发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gprof 的替代品 [关闭] 的相关文章

  • 使用 Forever 和 --prof 选项启动节点 V8 日志文件未创建

    我正在尝试使用 forver 模块运行我的节点应用程序 我还想传递 prof 选项来分析我的应用程序 我正在使用的命令是 NODE ENV staging PORT 3000 NODE CONFIG DIR domains serving
  • “gprof”在特定代码行上花费的时间

    我一直在使用gprof分析器结合g 我的代码中有一个函数 它封装了与主要函数足够相关的几个行为部分 因此将它们分成自己的函数是没有意义的 我想知道在每个代码区域花费了多少时间 所以 如果你想象代码看起来像 function A A A B
  • 在大型文本文件中搜索字符串 - 分析 python 中的各种方法

    这个问题已经被问过很多次了 花了一些时间阅读答案后 我做了一些快速分析来尝试前面提到的各种方法 我有一个600 MB文件与600万字符串行 DMOZ 项目的类别路径 每行的条目都是唯一的 我想要load文件once 不停寻找用于数据中的匹配
  • 当我在模型中加载数据库时,如何在 Codeigniter Profiler 中显示数据库查询?

    我的 Codeigniter 系统使用多个数据库 我不需要每个页面上的每个数据库 因此我在需要的模型中加载每个连接 然后在每个控制器中加载所需的模型 当我以这种方式加载内容时 探查器不会显示来自这些数据库的任何查询 这是我在模型中加载数据库
  • 测量 x86-64 中的 TLB 未命中处理成本

    我想估计运行 Linux 的 x86 64 Intel Nehalem 计算机上由于 TLB 未命中而导致的性能开销 我希望通过使用一些性能计数器来获得这个估计 有人知道估计这个的最佳方法是什么吗 谢谢 阿尔卡 如果您可以访问基于 West
  • Visual Studio 2013/2015/2017 探查器在 web.config 中添加了不可发布的行?

    今天 我只是在 Instrumentation 模式下使用 Visual Studio 的分析器来分析我的 WCF 应用程序 后来我需要发布到我的网络服务器 突然我收到一条错误消息 指出找不到 Microsoft VisualStudio
  • C++ - 检测超出范围的访问

    我想分析我的 C 代码以查找向量和数组中的错误访问 超出范围访问 是否有工具可以实现这一点 提前致谢 如果您使用的是 gcc 则可以使用定义的 GLIBCXX DEBUG 和 GLIBXX DEBUG PEDATIC 进行编译 如果请求越界
  • 交互式 Python:尽管正确导入了 line_profiler,但无法使 `%lprun` 工作

    Problem 大多数 iPython 神奇函数 对我来说立刻就可以正常工作 hist time prun等等 但是 我注意到 lprun无法使用 iPython 找到它 因为我最初安装了它 尝试解决 然后我发现我应该安装line prof
  • 我应该检查什么:cpu 时间还是 wall time?

    我有两种算法来完成相同的任务 要检查它们的性能 我应该检查什么 cpu 时间还是 wall time 我认为这是CPU时间 对吗 我正在对我的代码进行并行处理 要检查我的并行性能 我应该检查什么 cpu 时间还是 wall time 我想现
  • 超低延迟硬实时多线程 x86 代码的意外周期性行为

    我正在具有 RT 优先级的专用 CPU 上循环运行代码以进行多次迭代 并希望长时间观察其行为 我发现代码有一个非常奇怪的周期性行为 简而言之 这就是代码的作用 Arraythread while 1 if flag Multiply mat
  • 针对 PyPy 进行优化

    这是后续PyPy 的统计分析器 https stackoverflow com questions 17346226 statistical profiler for pypy 我正在 PyPy 下运行一些 Python 代码 并希望对其进
  • Valgrind 自动测试——它们在什么地方使用过吗?

    您认为基于 valgrind 工具套件运行一组自动测试有意义吗 您听说过或看到过这样的设置吗 这样的设置可以执行哪些自动 不受人类直觉影响 操作 如果您在单元测试或最终构建测试中检查内存问题 错误代码 那么这是有意义的 可能有两种方法 编写
  • C#/.NET 分析器应具有哪些功能?

    这可能是一则边缘广告 更不用说主观了 但这个问题是诚实的 在过去的两个月里 我一直在为 NET 开发一个新的开源分析器 称为 SlimTune Profiler http code google com p slimtune http co
  • Xcode GPU 着色器分析器

    Xcode gt GPU Capture 框架 gt GPU 着色器分析器无法工作 我运行 Capture 框架 并通过 GPU 着色器分析器打开 Metal 计算着色器源代码 但我看不到这样的着色器代码性能概况GPU 着色器分析器 htt
  • 有没有办法使用 perf 工具查找流程中各个功能的性能?

    我正在尝试在流程中实现各个功能的性能 我该如何使用 perf 工具来做到这一点 还有其他工具吗 例如 假设 main 函数调用函数 A B C 我想分别获得主要功能以及功能 A B C 的性能 有没有一个很好的文档来了解 perf 源代码
  • 如何离线分析使用 pstats.dump_stats(filename) 创建的文件?

    我基本上做了以下工作 import cProfile pstats StringIO pr cProfile Profile pr enable my code did something pr disable s StringIO Str
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf
  • 您推荐使用哪些工具来分析 Rails 应用程序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找 Rails 的分析工具 我目前正在玩和测试 ruby prof 和 Railsbench 但我对使其工作所需的大量调整和修改
  • GProf 输出中缺少函数

    我正在尝试分析一些 C 代码 但最直观地成本最高的函数之一并未出现在 GProf 输出中 int main initialise haloSwap for functions propagate functions void propaga
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具

随机推荐

  • 如何从 iOS 应用程序中将视频上传到 YouTube? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 在我的 iOS 应用程序中
  • 如何使用 python 从包含数千个文件的目录中复制前 100 个文件?

    我有一个巨大的目录 并且一直在更新 我试图使用 python 仅列出目录中最新的 100 个文件 我尝试使用 os listdir 但是当目录大小接近 1 00 000 个文件时 listdir 似乎崩溃了 或者我没有等待足够长的时间 我只
  • HashMap 中的键是否存在检查

    检查 HashMap 中的键是否存在总是必要的吗 我有一个包含 1000 个条目的 HashMap 我正在考虑提高效率 如果HashMap的访问非常频繁 那么每次访问时都检查键是否存在将导致很大的开销 相反 如果密钥不存在并因此发生异常 我
  • 如何在 ASP.NET MVC 中禁用会话状态?

    我想要一个非常轻量级的 ASP NET MVC 站点 其中包括删除尽可能多的常用 HttpModule 并禁用会话状态 但是 当我尝试执行此操作时 出现以下错误 The SessionStateTempDataProvider requir
  • 如何在 PHP 中第 n 次出现针时分割字符串?

    必须有一种快速有效的方法来在针的 第 n 次出现处分割 文本 字符串 但我找不到它 里面的功能还是比较齐全的PHP手册中的strpos注释 但这对于我的需要来说似乎有点多了 我有纯文本作为 string并想将其拆分为nth的发生 needl
  • 构造函数 ProcessBuilder(String, String, String) 未定义

    在同一个 IDE Eclipse 中 我有两个项目都有 ProcessBuilder builder new ProcessBuilder cmd exe c command 但在项目一中它没有显示编译错误 但在项目二中它显示编译错误两个
  • 在 Qt 中处理非常大的图像

    我无法让 Qt 处理超过 10 000X10 000 的图像 我正在处理每张大约 2GB 的巨大卫星图像 我考虑过使用内存映射 但图像仍然占用内存空间 QFile file c qt a ras file open QIODevice Re
  • python webbrowser.open(url)

    httpd make server 80 server webbrowser open url httpd serve forever 这可以跨平台工作 除非我在 putty ssh 终端上启动它 我如何欺骗控制台在单独的进程中打开 w3m
  • 为什么原始 numpy 数组在更改从它创建的另一个数组时会发生变化?

    我有一个 numpy 数组r当我用来创建另一个数组时r2从中取出并转动该新阵列r2为零它也改变了原始数组r 我搜索了类似的问题 但没有找到任何令人满意的答案 所以请考虑提出一个合适的答案 原始数组 gt gt gt r array 0 1
  • 从 python 程序中禁用哈希随机化

    从Python 3 3开始 哈希算法是非确定性的salted以避免某种攻击 这对于网络服务器来说很好 但在尝试调试程序时却很痛苦 每次运行脚本时 字典内容都会以不同的顺序迭代 一些早期版本的 python 有一个 R标记为enabling哈
  • 有什么理由在 C++03 中使用“auto”关键字吗?

    Note这个问题最初发布于 2009 年 在 C 11 被批准之前 在auto关键字发生了很大的变化 提供的答案涉及onlyC 03 的含义auto 这是指定的存储类 而不是 C 11 的含义auto 这是自动类型推导 如果您正在寻找有关何
  • unix下隐藏文件的正则表达式

    我正在寻找一个正则表达式来匹配以 开头的每个文件 在一个目录中 我正在使用 CMake 来自 CMake 文档 CMake 需要正则表达式 而不是 glob 并且想要忽略以点开头的每个文件 隐藏文件 但是 or 不起作用 奇怪的是 这有效
  • 使用 ScriptEngine (.NET 3.5) 在 C# 中执行 Selenium python 单元测试时遇到问题

    第一次海报 我正在转向关于堆栈溢出的第一个问题 因为我在尝试寻找答案时发现了很少的资源 我正在寻找从 C 应用程序执行 Selenium python 测试 我不想每次都编译 C Selenium 测试 我想利用 IronPython 脚本
  • 为什么 C++ 中 char 不被视为数字?

    我用 C 编写了一段代码 运行完美 我将其翻译为 C 那里给出了错误的输出 我有一个迭代 我将输入和迭代器变量都用作 char 以节省空间 但表现并不如预期 unsigned char repeat i cin gt gt repeat f
  • 处理日期/时间和时区的奇怪时间偏移

    我一直在尝试编写一些函数来根据谷歌电子表格上多个单元格的信息创建谷歌日历和谷歌日历事件 发布的第一期here日期部分已经得到解决 现在我在时间部分遇到问题 下面的代码 var ss SpreadsheetApp getActiveSprea
  • 有人可以向我解释一下这是什么类型吗? [复制]

    这个问题在这里已经有答案了 我发现了这种排序 有人可以向我解释一下它是什么类型吗 我认为这是选择排序对吗 嵌套循环如何工作 for i 0 i lt N i for j i 1 j lt N j if toSort i gt toSort
  • 数据总是在变化(SQL Server Management Studio)

    我正在使用 SQL Server Management studio 并不断收到相同的错误 摆脱它的唯一方法 通常 是重置 SQL Server 这非常烦人 有时在我的远程计算机上是不可能的 当我向表中添加一行 然后转到 编辑前 200 行
  • 在 PuTTY 中启动 SSH 连接,运行命令,并使会话保持活动状态

    我想每次通过 PuTTY SSH 到服务器时运行一些 shell 命令 我正在连接到由其他人管理的生产 Web 服务器 并且我不想在那里存储我自己的脚本 我看到了这个选项连接 gt SSH gt 远程命令 但是如果我将初始化命令放在那里 启
  • TypeScript:将键值类型反向映射到值键

    给定一个类型的对象 type Key2Value foo bar voo doo 假设该类型的值始终是字符串类型 如何构造实用程序类型ReverseMap
  • gprof 的替代品 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其