首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何分析和/或消除由于内存分配而导致的性能差异?

如何分析和/或消除由于内存分配而导致的性能差异?
EN

Stack Overflow用户
提问于 2013-07-29 11:13:11
回答 1查看 53关注 0票数 0

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

我的猜测是,因为C++/Win32/MFC代码还使用可变长度的std:vectors和std::list,所以它经常需要从操作系统获取内存,并且必须定期等待操作系统执行一些垃圾收集或其他操作。我该如何验证这个猜想呢?有没有办法调整内存分配,使操作系统进程的影响更小?

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

EN

回答 1

Stack Overflow用户

发布于 2013-07-29 11:23:12

测试的简单方法是不将数据放入任何结构中。即排除任何你怀疑的可能是问题的东西。您可能还会认为,延迟可能是操作系统将您的进程从上下文中切换出来,以便将时间分配给其他进程。

如果您正在将大量数据推送到一个向量上,使其不断增长,那么当向量调整大小时,您将遇到周期性的延迟。在这种情况下,延迟可能会变得更长、更不频繁。缓解这一问题的一种方法是使用deque,它按块分配数据,但放宽了所有数据都在连续内存中的要求。

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

以上所有操作都是基于这样一个假设:您需要存储所有传入数据。如果你不需要这样做,那就不要这样做。在这种情况下,它会表明你的症状与操作系统将你排除在外有关。你可以研究改变你的线程的优先级。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17915517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档