分析(可能受 I/O 限制)进程以减少延迟

2024-01-19

我想提高大型应用程序中特定方法的性能。

目标是改善延迟(特定功能所花费的挂钟时间),而不是(必然)系统负载。

要求:

  1. 由于我预计大部分延迟是由 I/O 造成的,因此请考虑等待/阻塞所花费的时间(换句话说:查看挂钟时间而不是 CPU 时间)
  2. 由于该程序所做的不仅仅是我正在尝试优化的片段。需要有一种方法可以以编程方式启动/停止分析,或者过滤输出以仅显示进入和退出我正在优化的函数之间的时间。
  3. 方法级别的分析是可以接受的(如果可以在指令级别完成,那就更好了。如果它只分析系统调用,那可能还不够)
  4. 这是一个业余爱好项目,因此昂贵的工具并不是真正的选择
  5. 仪器(-finstrument-functions)是可以接受的
  6. 我感兴趣的关键代码很难手动中断(因为它已经相对较快并且很难在循环中实际调用),因此需要某种自动化。

迄今为止废弃的工具:

  • gprof、oprofile、callgrind(要求 1)
  • 使用 getrusage 构建自定义内容(要求 1)
  • badmansprofiler.org(要求 2)
  • strace -T,dtrace,http://perf.wiki.kernel.org http://perf.wiki.kernel.org(要求2和3)
  • VTune、缩放(要求 4)
  • 手动调用堆栈采样(要求 6)
  • google-perftools(应该能够测量挂机时间,但这在我的情况下似乎不起作用,大概是因为 SIGALRM 干扰。
  • systemtap(我的内核没有修补以包含 utrace)

我尚未进一步评估的其他选项:

  • cprof(这里不是开箱即用的,似乎仅限 i386)
  • 手动插入跟踪点(例如使用 lttng)

我很想听听:

  • 其他选项
  • 也许我太早丢弃了一些工具?
  • 我尚未评估的选项是否有机会发挥作用,如果有,如何最好地做到这一点。

我最终决定:

  • 自己使用 -finstrument-functions 构建一些自定义的东西,基于http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

这个原始工具产生的跟踪很难解释,我可以很容易地想象一些工具可以进一步处理其输出,使其变得更加有用。然而,这对我来说目前已经完成了工作,所以我将该项目推迟到以后;)。


Use 这个方法 https://stackoverflow.com/a/378024/23771.

无论是在 CPU 还是 IO 密集型代码中,它都非常简单且有效地找出优化机会。

如果你认为最大的机会是在某个特定的功能或模块中,那么它就会找到它们。如果他们在其他地方,它会找到他们。

在您提到和放弃的工具中,它与穷人的分析器最相似,但仍然不是很相似。

编辑:既然您说它是由用户交互触发的,并阻止进一步的输入直到完成,那么我将这样做。

首先,我假设它不会阻止向调试器发送手动中断信号,因为否则您将无法停止无限循环。 其次,我会围绕相关例程循环 10、100 或 1000 次,因此它的执行时间足够长,可以手动中断。

现在,假设它花费一小部分时间进行 I/O,例如 50%。那么当你中断它时,你有 50% 的机会在 I/O 中捕获它。 因此,如果您在 I/O 中捕获它(调用堆栈会告诉您),您还可以详细了解从何处请求 I/O 以及原因。

它会向您展示正在发生的事情,这几乎肯定是令人惊讶的事情。 如果您看到它在少至两 (2) 个样本上执行某些操作,并且您可以找到消除的方法,那么您将获得相当大的加速。 事实上,如果您消除该活动,您事先并不知道您将节省多少时间,但平均而言您可以预期节省一小部分时间F = (s+1)/(n+2), where n是您采集的样本总数,并且s是显示活动的样本数。(继承规则) http://en.wikipedia.org/wiki/Rule_of_succession例如,如果您采集了 4 个堆栈样本并查看了其中 2 个的活动,那么平均而言,这会节省您的时间F = 3/6 = 1/2,对应于加速因子1/(1-F) or 2.

完成此操作后,您可以再次执行此操作并找到其他问题来修复。 加速因素像复利一样相乘。

然后,当然,您删除了外循环并“兑现”了您获得的所有加速。

如果您想知道这与分析有何不同,那就是通过仔细检查每个堆栈样本以及可能相关的数据,您可以识别可以删除的活动,如果您拥有的只是测量值,那么您只能尝试凭直觉来了解到底是怎么回事。 无论进行何种测量,您实际节省的时间就是实际节省的时间。 重要的是find问题。 无论分析器测量得多么精确,如果你不能find它,你没有赢。 这些页面上充满了人们说他们要么不明白他们的分析器告诉他们什么,要么似乎在说没有什么可以修复的,而他们非常愿意接受。 这是一个有色眼镜的情况。

更多关于这一切。 https://scicomp.stackexchange.com/a/2719/1262

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

分析(可能受 I/O 限制)进程以减少延迟 的相关文章

随机推荐

  • 如何使用 iPhone 中的当前日期(今天)获取本周、本月、今年的所有日期/日期

    在我的应用程序中 我必须在表格视图中按日期显示工作时间列表 这里我有5个场景 今日项目 工作时间 选定日期项目 时间 本周 周日至周六 当月 工作时间为一月 如果是二月则为二月 如果是三月则为三月 当年 2013年所有工作时间 我已经实现了
  • 进行 RPC 调用时出现序列化异常

    我创建了一个非常基本的应用程序 我只有一个服务类和一个相应的异步类 该类仅包含 Java 类型 没有自定义类 但我仍然遇到序列化异常 我的服务类看起来像这样 public interface MyService extends Remote
  • u-boot 可以支持多个以太网端口吗?

    我想从多个以太网端口执行 ping 操作 u boot 仅支持单个以太网端口是否存在固有限制 u boot 可以支持多个以太网端口吗 是的 在最近版本的 U Boot 中 至少可以追溯到 2012 10 突出的代码是eth current
  • GLSL、Opengl 中的视差贴图问题

    我的视差贴图给出了错误的结果 我不知道出了什么问题 影子 放错了地方 光线从观察者处射向立方体 Shader程序 基于dhpoware com vert varying vec3 lightDir varying vec3 viewDir
  • 从图库(SD 卡)中选择图像用于我的应用程序时发生异常... java.lang.OutOfMemoryError:位图大小超出 VM 预算

    我正在使用 Android 在我的应用程序上选择图像 我不知道为什么 有时我会遇到例外 我认为我总是选择超过 400 或 500 kb 的图像 但我不确定 为什么 因为当我选择 100 kb 的小图像时 我没有遇到异常 而当我获取高 KB
  • 为什么 Bootstrap 尝试在 Edge 中加载 LESS 文件?

    我有一个使用 Twitter Bootstrap 的网页 它在 Chrome Firefox 和 Safari 中运行良好 然而 当我尝试在 Windows 10 上的 Edge 中查看它时 收到一堆 403 错误 指出它无法从 Boots
  • 有什么方法可以将 HTML 添加到 Xamarin.Forms 页面中吗?

    我希望能够将一些 HTML 添加到 Xamarin Forms 页面中 这可能吗 是否可以将其添加为标签的一部分 如果您想要完整的 html 支持 那么 Xamarin formsWebView将会是一个不错的选择 但如果你想要一些基本的格
  • Angular 2,设置默认值以选择选项

    我尝试为选项添加默认值 它就像一种占位符 我使用这个方法 https stackoverflow com questions 5805059 how do i make a placeholder for a select box去做吧 在
  • 混合 C++ ABI 以针对遗留库进行构建

    情况是这样的 我有一个使用最新 GCC 4 3 3 的 C 代码库 但我需要链接到使用 GCC 3 2 3 构建的旧库 该库没有可用的新版本 我不能没有它 而且它是闭源的 因此无法重建 这似乎造成了一个问题 因为 GCC 4 3 3 和 3
  • 用 PHP 编译带有多个附件的电子邮件

    我需要从 PHP 发送一封包含多个图像附件的电子邮件 我目前有一个使用两个硬编码图像的测试设置 我用所有必要的标题编译电子邮件并将其发送出去 但是 当我收到它时 它只显示第一张图片作为附件 第二张图片似乎被忽略了 使用 Groupwise
  • 将关联数组变成类似于 Eloquent 查询集合的集合

    我有一个正在接收 API 数据的类 我想将所有响应包装到一个集合类中 因此 我从 API 调用接收数据 将其转换为普通的关联 php 数组 并使用collect helper 我本以为它能像 Eloquent 一样工作 你可以将键引用为集合
  • 如何使用 Selenium Web 驱动程序上传文件/处理窗口

    我正在尝试自动化一个场景 在该场景中我必须上传文档 但我无法处理上传文件一旦我单击网络应用程序上的 选择文件 按钮 就会出现窗口 我使用的是 C 语言和 Chrome 浏览器 我的 C 测试用例 Test Description JAVA
  • ARM 模板部署不会删除旧管道

    我正在使用 ARM 模板部署我的数据工厂 当我删除管道时 旧版本不会从目标环境中删除 重命名也会发生同样的情况 我的目标环境包含一个具有旧名称的管道和一个具有新名称的管道 如何删除带有 ARM 模板部署的旧管道 注意 我只想删除数据工厂内的
  • Mathematica 中的树数据结构

    我主要使用mathematica 作为数学工作台和编写相对较小的临时程序 然而 我正在设计一个系统 打算在 Mathematica 中编程 我需要将数据存储在树中 并搜索和遍历树 尽管我知道如何实现树 但我更喜欢标准的 经过测试的代码 我在
  • Spring:正确设置@ComponentScan

    我为我的设置进行了以下设置Spring Application Context Configuration public class RmiContext Bean public RmiProxyFactoryBean service Rm
  • 可空类型“int”的默认值是多少? (包括问号)?

    在C 中 类型的类实例变量的默认值是多少int 例如 在下面的代码中 什么值将MyNullableInt如果从未明确分配的话有吗 class MyClass public int MyNullableInt 看来答案几乎肯定是null or
  • 无法删除表用户,因为其他对象依赖于它

    我想将我的表删除到数据库中 但是 当我使用时 例如 DROP TABLE if exists users 我收到这条消息 cannot drop table users because other objects depend on it
  • Laravel 路由不调用控制器的功能

    我在页面 刀片 中有一个表单 它重定向到一个路由 该路由要调用控制器中的函数 但它甚至不会进入函数内部 因为即使是简单的 dd 不能被执行 在途中 如果我更改为 Route post edit profile function Reques
  • 无法使用自定义样式编织为 pdf

    尝试使用自定义 mystyles sty 文件从 RStudio 编织为 pdf 这曾经工作正常 但现在我已经升级到 RStudio 1 044 我收到错误 Example title Test output pdf document in
  • 分析(可能受 I/O 限制)进程以减少延迟

    我想提高大型应用程序中特定方法的性能 目标是改善延迟 特定功能所花费的挂钟时间 而不是 必然 系统负载 要求 由于我预计大部分延迟是由 I O 造成的 因此请考虑等待 阻塞所花费的时间 换句话说 查看挂钟时间而不是 CPU 时间 由于该程序