gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:29:58 24 4
gpt4 key购买 nike

我有一个实时应用程序,它通常在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com