c++ - 如何分析和/或消除由于内存分配引起的性能变化?

标签 c++ memory-management stdvector

我有一个实时应用程序,它通常在 2-5 毫秒内处理每个传入数据 block ,但有时它会激增至几十毫秒。我可以随心所欲地生成和重复传入数据的序列,并证明尖峰与特定数据 block 无关。

我的猜测是,因为 C++/Win32/MFC 代码也使用可变长度的 std:vectors 和 std::lists,它经常需要从 OS 获取内存,并且周期性地等待 OS 做一些垃圾回收什么的。我该如何检验这个猜想?有什么方法可以调整内存分配以减少操作系统进程的影响吗?

上下文:将应用程序视为网络协议(protocol)分析器,它实时收集数据并使其可供检查。数据“捕获”始终在最高优先级线程中运行。

最佳答案

测试的简单方法是不要将数据放入任何结构中。 ie 消除您怀疑可能是问题的任何内容。您可能还认为延迟可能是操作系统将您的进程从上下文中切换出来,以便为其他进程腾出时间。

如果您将大量数据推送到 vector 上,使其不断增长,那么在调整 vector 大小时您将遇到周期性延迟。在这种情况下,延迟可能会变得更长且频率更低。缓解这种情况的一种方法是使用 deque,它以 block 的形式分配数据,但放宽了所有数据都在连续内存中的要求。

另一种解决方法是创建一个处理分配的后台线程,前提是您知道它可以比使用它的进程更快地分配内存。您不能为此直接使用标准容器。但是,您可以通过分配恒定大小的 vector block 或简单地使用传统的动态数组来实现类似于 deque 的东西。这里的想法是,一旦您开始使用新 block ,您就会向后台进程发出信号以分配新 block 。

以上所有内容均基于您需要存储所有传入数据的假设。如果您不需要这样做,请不要这样做。在这种情况下,这表明您的症状与操作系统将您拒之门外有关。您可以调查更改线程的优先级。

关于c++ - 如何分析和/或消除由于内存分配引起的性能变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17915517/

相关文章:

c++ - 使用 IMFSourceResolver::CreateObjectFromByteStream

c++ - 如何读取包含空格的数据

c++ - 程序中的每一行(变量声明除外)最终都会使用至少一个系统调用吗?

c# - 有没有办法检索 C# 应用程序的当前内存使用情况?

ios - 从 'requestImageForAsset' 返回的 UIImage 大小甚至不接近 'targetSize' 设置

c++ - 指针不会返回 char 类型的地址

java - 是否可以在 Java 中声明一个 1 位变量?

c++ - 根据一组模式对 vector 的成员重新排序

c++ - 如何在不复制的情况下将一个 vector move 到另一个 vector

c++ - 如何从特征矩阵映射/构建 C++ vector ?