我正在查看两个版本之间出现的性能问题(这是一个 Windows 应用程序)。 我观察到的是,较慢的版本比前一个版本做更多的 I/O (我用进程浏览器观察到这一点(见下图))当另一个不做或很少做时,I/O 与较少的 cpu 事件相关。所以我猜测性能损失来自 I/O。
但是由于代码相当大,并且由不同的团队共享,所以不容易发现发生了什么变化。此外,两个版本之间的差距也很重要。 从我的角度来看,这两个版本应该仍然是同一种工作...... 所以知道这个应用程序正在执行文件 + 数据库访问,是否有人知道一种方法(或工具)来发现代码的哪一部分可能涉及重要的 I/O 事件?
我尝试了一些分析器 (ltprof),但到目前为止运气不太好。 我已经尝试进行一些统计调试(每隔几秒暂停一次)以查看调用堆栈是什么),但由于 I/O 似乎只占进程的一小部分(比如说少于 < 15%), 到目前为止我还没有找到任何相关的东西。
非常感谢任何想法。
最佳答案
Process Monitor来自 Sysinternals(现在是 Microsoft 的一部分)的日志将创建一个进程(或多个进程)执行的所有 I/O 操作的日志。它可能会为您提供有关所有额外 I/O 是什么的线索,但不会将您指向代码的特定部分。您可以将日志与更快版本的日志进行比较,看看有什么不同。您也许还能够发现模式(例如冗余工作,或者从后到前而不是从前到后编写)。
如果总 I/O 大致相同,则问题可能是锁争用而不是 I/O。
关于c++ - 如何定位正在执行 I/O 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5569441/