我有一个C ++程序,内存泄漏非常可怕,大约4MB /秒。我知道它来自哪里可以解决它,但这不是我的主要问题。我的程序占用了大量的CPU,并且运行速度不如我想要的那么快。我在程序中有两个不同的线程。一个人自己需要大约50%的CPU,这很好,而另一个本身需要大约15%的CPU,这很好。但是,CPU使用率是100%,并且程序无法以所需的速度运行。
内存泄漏本身是否会导致这样的问题?我知道程序最终会因泄漏的内存而崩溃,但是内存泄漏会导致程序变慢吗?我立刻意味着程序从一开始就太慢了,而不仅仅是当内存占用空间很大时。
谢谢!
答案 0 :(得分:19)
无论您的内存泄漏是否导致问题,都需要修复。一旦你修复了内存泄漏,看看你是否还有问题。你应该能够在那时回答你自己的问题。
答案 1 :(得分:4)
一般来说,分配可能很慢,听起来你在这里做了很多。在修复泄漏之后,您将需要考虑池内存实现,以避免崩溃堆,特别是在多线程环境中。
答案 2 :(得分:3)
当您仍有可用内存时,这应该不是问题。但是,内存分配是一个相对较慢的过程,因此根据您执行此操作的频率,它可能会解决您的问题。
不要忘记,探查器是您所有优化需求的朋友。它比你更了解你的主要瓶颈。
哦,现在修复你的内存泄漏,虽然它仍然很容易。
答案 3 :(得分:1)
好吧,分配很慢,并且需要至少一些CPU工作来搜索适当的块来提供。除此之外,我不这么认为。听起来你的程序非常糟糕,所以我不怀疑心里有一些更大的问题。
答案 4 :(得分:1)
查看您的页面错误。在Windows中,使用任务管理器,在Unix / Linux中尝试ps。可能需要额外的处理器时间来为进程分配额外的内存,并且一旦空闲的物理内存耗尽,操作系统就必须将未使用的页面交换到磁盘。
另一种方法是使用分析工具来查看代码中的瓶颈所在。
答案 5 :(得分:1)
这里有几个角度: 1)你有内存泄漏。这必然会导致缓存中的页面错误,因此数据必须来自RAM /磁盘。更多I / O,更多问题。你在使用内存管理器吗?如果不考虑使用一个。查看dlmalloc的开始。
2)CPU使用率100%可能不是由于此问题。显然,要走的路是首先解决这个漏洞,然后使用剖析器[量化是最好的,但成本。 VTune也不错,虽然我不喜欢这个界面。其他gprof也不错,而且它是免费的。]并查看代码的哪些部分占用了CPU周期。
3)我看到你正在使用线程。同步线程并非易事。看看你是否在不必要地等待互斥或类似的东西。
答案 6 :(得分:0)
处理先前分配的内存片段应该比它们的分配相对更快(并且(只要内存泄漏意味着“由于缺少重新分配调用而导致内存丢失”)它不应该真正影响你的速度,只有整体内存使用量的
虽然如果你每秒分配大量内存并且没有进行适当的解除分配,这可能就是问题所在。 我在错误编译时gtkmm
+ librsvg
在屏幕重绘时泄露了〜每秒5兆字节时遇到了同样的问题,当然,这会产生一些显着的性能影响。
当然,这并不意味着如果您知道它们存在,就不应该消除内存泄漏。内存泄漏可能会导致比性能问题更严重的事情。