- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要优化一些遗留代码,而且我对 C++ 还很陌生。
代码在两个线程中进行网络数据包处理,一个线程将数据包推送到 FIFO [topupBuffer
],另一个线程从队列中读取并将它们发送到 IP 套接字 [writeToIPOutput
]。遗留代码使用 std::deque 来实现 FIFO。
但是,运行该程序会占用大量 CPU,高达 50%(需要更接近 5%)。运行 gprof 似乎揭示了 std::deque
是罪魁祸首。 (我不确定我是否正确解释了配置文件结果,因此不胜感激)
除了配置文件输出:topupBuffer 层次结构:
index % time self children called name
0.65 2.51 1/1 DvIPFilePlayback::topupBufferThreadMethod(void*) [2]
[1] 60.5 0.65 2.51 1 DvIPFilePlayback::topupBuffer() [1]
0.27 1.15 4025575/4025575 DvIPPlaybackBC::bufferizeTsPackets(TPlaybackBuffer&, int&, int&) [5]
0.03 0.56 4026668/4026668 std::deque<TTsPacket, std::allocator<TTsPacket> >::push_back(TTsPacket const&) [6]
0.03 0.15 4046539/5749754 std::deque<TPlaybackBuffer, std::allocator<TPlaybackBuffer> >::size() const [17]
和
[5] 27.2 0.27 1.15 4025575 DvIPPlaybackBC::bufferizeTsPackets(TPlaybackBuffer&, int&, int&) [5]
0.04 0.30 4031674/4031674 std::deque<TTsPacket, std::allocator<TTsPacket> >::pop_front() [11]
0.03 0.30 8058004/8058004 std::deque<TTsPacket, std::allocator<TTsPacket> >::size() const [12]
0.01 0.19 576183/576183 DvPlaybackBC::insertToPlaybackBuffer(TPlaybackBuffer const&) [22]
0.04 0.11 4029401/4029401 std::deque<TTsPacket, std::allocator<TTsPacket> >::front() [25]
writeToIPOutput 层次结构
[3] 36.8 0.92 1.00 1 DvIPPlaybackBC::writeToIPOutput() [3]
0.31 0.00 1129444/1129444 TPlaybackBuffer::operator=(TPlaybackBuffer const&) [13]
0.01 0.18 579235/1155128 std::deque<TPlaybackBuffer, std::allocator<TPlaybackBuffer> >::push_back(TPlaybackBuffer const&) [8]
0.03 0.10 1135318/1135318 std::deque<TPlaybackBuffer, std::allocator<TPlaybackBuffer> >::pop_front() [27]
我猜 writeToIPOutput
在赋值上花费了太多时间。我可以解决这个问题。但是 topupBuffer
在 std::deque
中花费了时间。
这是配置文件输出的正确解释吗?
如果是这样,那么使用不同的容器是否会更有效?如果是这样,使用哪个容器?</p>
谢谢
编辑我调用树末尾的注释说:
% time This is the percentage of the `total' time that was spent
in this function and its children. Note that due to
different viewpoints, functions excluded by options, etc,
these numbers will NOT add up to 100%.
self This is the total amount of time spent in this function.
children This is the total amount of time propagated into this
function by its children.
所以看看 bufferizeTsPackets
,1.15 花在了它的子节点上,其中 0.30 + 0.30 + 0.11 = 0.71 花在了不同的双端队列方法(push_back、size 等)上。正确的?所以 0.71 超过了花在 child 身上的总时间 (1.15) 的一半 (??)
最佳答案
更有效的结构是使用数组实现循环队列(环形缓冲区)。
由于数组是固定大小的,您要么必须使数组足够大,以免数据溢出;要么或者只存储最后 N 个值,其中 N 是缓冲区的容量。
许多嵌入式系统使用数组来减少由动态内存位置引起的内存碎片问题。
如果你的数组足够小,它可以放入处理器的数据缓存中;这加快了计算速度。
关于用于高性能 FIFO 的 C++ 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40345111/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我有以下对象: var myObj = { "4":{//The key is a number String. id:4,name
我需要构建某种字典,其中还包含每个单词在该语言中出现的单词频率。通常,这将使用 std::unordered_map 来实现,对吧?现在问题来了……我想找到所有符合某些正则表达式的单词及其频率,而性能
软件开发通常会提到一个名词 “三高”,即高并发、高性能、高可用。 具体的指标定义,如:高并发方面要求QPS 大于 10万;高性能方面要求请求延迟小于 100 ms;高可用方面要高于 99.99
我有一个大约有 108000 个三角形的网格,应该用 WebGL 渲染。 目前我不使用框架,只使用纯 WebGL。我已经通过 id 映射实现了对象识别,以便使用回调功能和基本的相机操纵器进行拾取。 现
我读过无数的帖子,无数次地重写过代码,我发现自己碰壁了。由于应用了 CSS scale3d 转换的容器,我试图克服在滚动页面时不使用 CSS 固定元素位置的限制。虽然我最新的解决方案有效,但它有时仍然
我正在开发一个嵌入式系统,它需要非常频繁地存储和检索数据。我预计每秒可能有 100 次写入和 10 次读取。数据将以突发而不是连续的方式到达。 我想使用 SQLite 来存储所有这些数据,但由于它是一
当前情况 在我们的一款 SPA Web 应用程序中,我们使用自定义跟踪器请求来跟踪各种用户操作,例如 cta 点击、页面导航 等,该请求将一些信息传递到后端使用 POST 请求。 问题现在,因为这些跟
我正在编写执行大量表查找的程序。因此,当我偶然发现 Data.Map (当然),以及 Data.HashMap 和 Data.Hashtable 时,我正在仔细阅读 Haskell 文档>。我不是散列
我正在评估我们的高性能电信应用程序的 BPEL 引擎,但性能似乎很差。我们评估了 Apache Ode、SunBPEL 引擎、Active BPEL 等。您知道任何更快的 BPEL 引擎实现或 C/C
我目前正在重写一个旧的 ASP\ASP.NET 应用程序。由于我无法完全重写,所以我需要分部分进行。现在我正在将代码库从 ODBC 升级到 .net 连接器。 有一个函数可以在用户每次访问页面时进行一
旁注:我正在使用 JQuery,但没有使用任何第三方表格组件(我现在也不能)。 我的问题是我应该能够显示很多(10000)条经过的消息——每秒都会有数百条新消息,它们应该被添加到底部。当我们达到 10
为了争论,假设我试图在 MySQL 表中表示一个非常简单的文件系统。请注意,这并不是我正在做的,它只是为问题的简单基础做准备。所以不要费心告诉我存储文件的更好方法。该表的架构如下: varchar p
我希望优化我使用python时遇到的大数据解析问题的性能。以防有人感兴趣:下面显示的数据是六种灵长类动物全基因组DNA序列比对的片段。 目前,我知道如何处理这类问题的最好方法是打开我的~250(大小2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我需要用 Ruby 制作一个小应用程序,它将以不同颜色显示通过 TCP 接收的日志行。推荐用于此类应用的 GUI 框架是什么? 我应该在 Windows 和 Linux 上工作。 最佳答案 Shoes
我正在尝试编写一个非常简单的 Web 服务器来执行以下操作: 接收请求。 响应一个小文件;关闭连接。 处理请求数据。 换句话说,响应不依赖于请求信息,但请求信息仍然很重要。数据将被保留,然后用于分析。
我正在使用 WebSocket 协议(protocol)(通过 WebSocketSharp)开发 C# 游戏服务器。目前,每当用户登录游戏时,我都会创建一个 token 并将其添加到 Concurr
我正在处理应用程序的延迟敏感部分,基本上我会收到一个网络事件来转换数据,然后将所有数据插入到数据库中。在分析之后,我发现基本上我所有的时间都花在了保存数据上。这是代码 private void ins
我正在尝试将视频输出(帧序列)输出到任何 qt 可见小部件。一开始我认为 QLabel 就足够了......但我错了。转换为像素图对于大型图像的处理器来说过于过载:例如 1080p。 还有其他解决方案
我是一名优秀的程序员,十分优秀!