试图理解为什么我的 C++ 程序在 运行 后长时间变慢
Trying to understand why my C++ program is slowing down after running for long time
到目前为止,None 个与我能找到的主题接近的线程(例如 this one)帮助了我。
我有一个 C++ 程序,它从文件中读取一些数据,运行s 相当复杂和密集的操作,然后将输出写入新文件。当我让进程 运行 几个小时时,以下是我注意到的行为:
- CPU 使用率相当稳定,但 RAM 会缓慢增加,直到达到某种上限,然后它也会变得稳定。
- RAM 使用量 'ceiling' 似乎会增加,具体取决于计算机的 RAM 配置。例如在16GB内存的电脑上是3~4GB,在64GB的电脑上是10~11GB)。
- 生成具有相似复杂性的文件的平均时间会随着时间的推移而增加,并且在某些时候会变得很大(给人的印象是该程序不再 运行ning)。
- 当它开始以这种方式变慢时,我终止了进程并使用新的 运行 程序重新开始生成相同的文件(从头开始),之前花了 3 小时完成的工作大约在5分钟
它可以是什么?我怀疑内存泄漏,但 RAM 不会无限期地增加吗?即使资源可用(CPU、RAM、磁盘 space 等),还有什么会导致程序逐渐变慢?
I suspected memory leaking, but then wouldn't the RAM keep increasing
indefinitely?
它会无限增加,只是您在查看的 RAM 使用统计信息中看不到它。
发生的事情是 OS 将继续分配新的物理 RAM 页面,直到观察到的上限点。那时,每当您的程序请求新内存时,它都会先将一些已分配的内存换出到磁盘,然后再在 RAM 中分配新的物理内存。因此,您可以通过以与由于泄漏而分配虚拟内存的速度大致相同的速度交换到磁盘来释放物理 RAM。由于换出的内存可能只包含泄漏的数据,您的程序不太可能再次触及它,因此它会无限期地保留在磁盘上。如果你让程序 运行 足够长,最终你也会 运行 在磁盘上交换 space。
由交换引起的磁盘常量 I/O 可能是观察到的减速的根本原因。
使用像LeakSanitizer or Valgrind这样的内存分析工具来检测内存泄漏。一旦您的程序的内存消耗停止持续增长,性能问题就会消失。
None 个与我能找到的主题接近的线程(例如 this one)帮助了我。
我有一个 C++ 程序,它从文件中读取一些数据,运行s 相当复杂和密集的操作,然后将输出写入新文件。当我让进程 运行 几个小时时,以下是我注意到的行为:
- CPU 使用率相当稳定,但 RAM 会缓慢增加,直到达到某种上限,然后它也会变得稳定。
- RAM 使用量 'ceiling' 似乎会增加,具体取决于计算机的 RAM 配置。例如在16GB内存的电脑上是3~4GB,在64GB的电脑上是10~11GB)。
- 生成具有相似复杂性的文件的平均时间会随着时间的推移而增加,并且在某些时候会变得很大(给人的印象是该程序不再 运行ning)。
- 当它开始以这种方式变慢时,我终止了进程并使用新的 运行 程序重新开始生成相同的文件(从头开始),之前花了 3 小时完成的工作大约在5分钟
它可以是什么?我怀疑内存泄漏,但 RAM 不会无限期地增加吗?即使资源可用(CPU、RAM、磁盘 space 等),还有什么会导致程序逐渐变慢?
I suspected memory leaking, but then wouldn't the RAM keep increasing indefinitely?
它会无限增加,只是您在查看的 RAM 使用统计信息中看不到它。
发生的事情是 OS 将继续分配新的物理 RAM 页面,直到观察到的上限点。那时,每当您的程序请求新内存时,它都会先将一些已分配的内存换出到磁盘,然后再在 RAM 中分配新的物理内存。因此,您可以通过以与由于泄漏而分配虚拟内存的速度大致相同的速度交换到磁盘来释放物理 RAM。由于换出的内存可能只包含泄漏的数据,您的程序不太可能再次触及它,因此它会无限期地保留在磁盘上。如果你让程序 运行 足够长,最终你也会 运行 在磁盘上交换 space。
由交换引起的磁盘常量 I/O 可能是观察到的减速的根本原因。
使用像LeakSanitizer or Valgrind这样的内存分析工具来检测内存泄漏。一旦您的程序的内存消耗停止持续增长,性能问题就会消失。