Can C++;内存泄漏会对CPU使用产生负面影响吗? 我有一个C++程序,内存泄漏很严重,大约4Mb/s。我知道它是从哪里来的,并且可以修复它,但这不是我的主要问题。我的程序占用了大量的CPU,而且运行速度没有我想要的那么快。我在程序中有两个不同的线程。一个单独占用约50%的CPU,这很好,另一个单独占用约15%的CPU,这很好。然而,CPU的使用率是100%,程序不能按需要的速度运行

Can C++;内存泄漏会对CPU使用产生负面影响吗? 我有一个C++程序,内存泄漏很严重,大约4Mb/s。我知道它是从哪里来的,并且可以修复它,但这不是我的主要问题。我的程序占用了大量的CPU,而且运行速度没有我想要的那么快。我在程序中有两个不同的线程。一个单独占用约50%的CPU,这很好,另一个单独占用约15%的CPU,这很好。然而,CPU的使用率是100%,程序不能按需要的速度运行,c++,memory,memory-leaks,cpu-usage,C++,Memory,Memory Leaks,Cpu Usage,内存泄漏本身会导致这样的问题吗?我知道程序最终会因为内存泄漏而崩溃,但内存泄漏是否会立即导致程序速度变慢?我所说的立即,是指程序在一开始就太慢,而不仅仅是在内存占用很大的时候 谢谢 当您还有可用内存时,这应该不是问题。然而,内存分配是一个相对缓慢的过程,所以取决于您执行分配的频率,它可能会解释您的问题 不要忘记,探查器是所有优化需求的朋友。它比你更清楚你的主要瓶颈是什么 哦,现在就修复内存泄漏,尽管这仍然很容易。无论内存泄漏是否导致问题,都需要修复。修复内存泄漏后,查看是否仍然存在问题。此时,您

内存泄漏本身会导致这样的问题吗?我知道程序最终会因为内存泄漏而崩溃,但内存泄漏是否会立即导致程序速度变慢?我所说的立即,是指程序在一开始就太慢,而不仅仅是在内存占用很大的时候


谢谢

当您还有可用内存时,这应该不是问题。然而,内存分配是一个相对缓慢的过程,所以取决于您执行分配的频率,它可能会解释您的问题

不要忘记,探查器是所有优化需求的朋友。它比你更清楚你的主要瓶颈是什么


哦,现在就修复内存泄漏,尽管这仍然很容易。

无论内存泄漏是否导致问题,都需要修复。修复内存泄漏后,查看是否仍然存在问题。此时,您应该能够回答自己的问题。

分配通常会很慢,听起来您在这里做了很多。在修复了漏洞之后,您将需要考虑一个池内存实现,以避免大量地浪费您的堆,特别是在多线程环境中。

嗯,分配是缓慢的,并且至少需要一些CPU的努力来寻找合适的块来提供。除此之外,我不这么认为。听起来你的程序乱七八糟,所以我不怀疑你的内心有更大的问题。

看看你的页面错误。在Windows中,请使用任务管理器,在Unix/Linux中,请尝试ps。可能是额外的处理器时间被用来为进程分配额外的内存,一旦可用物理内存耗尽,操作系统必须将未使用的页面交换到磁盘


另一种方法是使用分析工具查看代码中的瓶颈

处理以前分配的内存片段应该比分配的内存片段快,并且(只要内存泄漏意味着“由于丢失释放调用而丢失内存”),它不应该真正影响您的速度,只会影响总体内存使用率

尽管如果您每秒分配大量内存,并且没有进行适当的释放,这可能就是问题所在。当错误编译
gtkmm
+
librsvg
在屏幕重画时每秒泄漏约5兆字节时,我也遇到了同样的问题,当然,这对性能产生了一些显著的影响


当然,这并不意味着如果知道内存泄漏的存在,就不应该消除它们。内存泄漏可能会导致比性能问题更严重的问题。

这里有几个角度: 1) 你有内存泄漏。这必然会导致缓存中出现页面错误,因此数据必须来自RAM/磁盘。I/O越多,问题就越多。您正在使用内存管理器吗?如果不考虑使用一个。首先查看dlmalloc


2) CPU使用率100%可能不是由于此问题。显然,解决方法是首先修复此漏洞,然后使用探查器[Quantify是最好的,但成本很高。VTune不错,尽管我不喜欢这个接口。否则gprof不错,而且是免费的。]然后查看代码的哪些部分占用了CPU周期



3) 我看到您正在使用线程。同步线程是非常重要的。看看您是否在不必要地等待互斥或类似的东西

我有一艘叫泰坦尼克号的船,下面有点漏水。它在水面上移动得相当快,但这不是我的主要问题:我真的需要把甲板椅布置得恰到好处,但整艘船都向右舷倾斜,这意味着它们会左右滑动,我的船员不能像我需要的那样快。“他的理由是,这是什么?我甚至都不……代表那句话,因为它让我大笑起来。尼克:我理解你的意思。我之所以忽略这些漏洞,是为了确定程序是否足够快。如果是这样的话,我正计划修复漏洞。如果不是的话,泄漏不会有多大影响,因为我必须改变设计。问题是,不受控制的内存增长可能会导致各种奇怪的副作用,因此必须先修复这些问题,然后才能判断可能存在或不存在的其他问题。如果内存增长不受控制,那么分析CPU使用情况是没有用的。谢谢,这似乎是最合乎逻辑的方法。我会调查的。4MB/s是一个巨大的漏洞,需要非常快的速度,我可能在某处做了一些愚蠢的分配。谢谢你的回复。我一直在努力寻找一个像样的(免费的)剖析器,但运气不太好。我正在编写的程序必须在很短的时间内每10毫秒进行大量计算,比如说1-5毫秒,所以我不能只使用告诉我总体CPU使用情况的东西,这是大多数免费分析器似乎都要做的。堆越大,分配越慢。这很可能是一个严重的性能问题(特别是当泄漏导致异常碎片时)。泄漏可能不会导致碎片-这毕竟是在两次分配之间释放内存的结果。我怀疑问题在于:(1)CRT需要调用操作系统来扩展堆,而不是回收进程内存;(2)操作系统可能需要交换页面(包括应用程序泄漏的内存)以满足堆增长请求。