c++ - 如何定位正在执行 I/O 的代码

标签 c++ windows performance debugging

我正在查看两个版本之间出现的性能问题(这是一个 Windows 应用程序)。 我观察到的是,较慢的版本比前一个版本做更多的 I/O (我用进程浏览器观察到这一点(见下图))当另一个不做或很少做时,I/O 与较少的 cpu 事件相关。所以我猜测性能损失来自 I/O。

但是由于代码相当大,并且由不同的团队共享,所以不容易发现发生了什么变化。此外,两个版本之间的差距也很重要。 从我的角度来看,这两个版本应该仍然是同一种工作...... 所以知道这个应用程序正在执行文件 + 数据库访问,是否有人知道一种方法(或工具)来发现代码的哪一部分可能涉及重要的 I/O 事件?

我尝试了一些分析器 (ltprof),但到目前为止运气不太好。 我已经尝试进行一些统计调试(每隔几秒暂停一次)以查看调用堆栈是什么),但由于 I/O 似乎只占进程的一小部分(比如说少于 < 15%), 到目前为止我还没有找到任何相关的东西。

非常感谢任何想法。

enter image description here

最佳答案

Process Monitor来自 Sysinternals(现在是 Microsoft 的一部分)的日志将创建一个进程(或多个进程)执行的所有 I/O 操作的日志。它可能会为您提供有关所有额外 I/O 是什么的线索,但不会将您指向代码的特定部分。您可以将日志与更快版本的日志进行比较,看看有什么不同。您也许还能够发现模式(例如冗余工作,或者从后到前而不是从前到后编写)。

如果总 I/O 大致相同,则问题可能是锁争用而不是 I/O。

关于c++ - 如何定位正在执行 I/O 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5569441/

相关文章:

c++ - 从两个接口(interface)实现创建实例

c# - 来自 EventHandler 的 Console.Writeline

c++ - MVC++ 静态库不生成任何导出

c++ - apache 上的 ap_log_error 转储从 apache 2.4 开始

c# - 关闭windows框C#

windows - 批处理文件中使用 vbscript 命令的批处理脚本问题

java - Android NDK 性能优于常规 Java 代码

java - 在 Java 中复制大型数组的最有效方法

sql - 跨同一服务器上的两个 mysql 数据库查询的性能?

android - 在 OpenCV android 应用程序中启用 "libc++_shared.so"