C++;通过在后台运行另一个项目来提高项目性能? 我试图通过优化我的代码中最耗时的部分来提高我的C++人脸跟踪算法的性能。有趣的是,整个跟踪处理时间的86%被其特征提取部分占用。该特征提取器将图像作为输入,并返回特征向量作为输出。我将特性提取器从跟踪器隔离到一个单独的项目中,以从头开始编写一个优化版本,并确保输入和输出格式以及容器与原始跟踪器中使用的相同。下面是结果处理时间的细目 原版3毫秒/帧 优化版本1毫秒/帧

C++;通过在后台运行另一个项目来提高项目性能? 我试图通过优化我的代码中最耗时的部分来提高我的C++人脸跟踪算法的性能。有趣的是,整个跟踪处理时间的86%被其特征提取部分占用。该特征提取器将图像作为输入,并返回特征向量作为输出。我将特性提取器从跟踪器隔离到一个单独的项目中,以从头开始编写一个优化版本,并确保输入和输出格式以及容器与原始跟踪器中使用的相同。下面是结果处理时间的细目 原版3毫秒/帧 优化版本1毫秒/帧,c++,cpu-usage,C++,Cpu Usage,正如我们所看到的,它应该快3倍。但是,当我将新的功能提取器插入我的跟踪器时,它在跟踪器中以大约2.5ms/frame的速度运行。我不明白为什么它在跟踪器中比作为独立项目运行时慢 但这是我偶然发现的陷阱。如果我运行跟踪器,同时在后台运行另一个项目,跟踪器中的特征提取程序会突然收敛到1 ms/frame。但一旦我停止后台项目,它就会返回到2.5ms/frame。这种情况发生在我的笔记本电脑(Ubuntu 16.04)和台式电脑(Windows 10)上 为了理解这种行为,我使用了我的Ubuntu系统

正如我们所看到的,它应该快3倍。但是,当我将新的功能提取器插入我的跟踪器时,它在跟踪器中以大约
2.5ms/frame
的速度运行。我不明白为什么它在跟踪器中比作为独立项目运行时慢

但这是我偶然发现的陷阱。如果我运行跟踪器,同时在后台运行另一个项目,跟踪器中的特征提取程序会突然收敛到
1 ms/frame
。但一旦我停止后台项目,它就会返回到
2.5ms/frame
。这种情况发生在我的笔记本电脑(Ubuntu 16.04)和台式电脑(Windows 10)上

为了理解这种行为,我使用了我的Ubuntu系统监视器,并注意到以下关于所有8个CPU内核的内容

  • 当我单独运行feature extractor时,7个内核的占用率约为5%,其中一个内核的占用率为100%

  • 当我在跟踪器中插入特征提取器并运行跟踪器时,所有8个内核都被30%的内存占用

  • 现在,当我运行跟踪器时,我会和跟踪器一起运行任何其他程序(比如独立的功能提取器),在30%参与的所有内核中,有一个会跳到100%参与,这可能解释了我在跟踪器中得到的性能提升


证据表明,为了使特征提取程序以
1 ms/帧
的最大电位运行,至少一个核心应100%啮合。我的问题是如何实现这一点?

如果你对cargo cult编程没问题,你可以在(1){}循环中产生一个
线程,这将导致内核以100%的CPU使用率旋转。然而,这不太可能是最好的解决方案——更好的方法是进一步研究这个问题,在你非常确定你了解观察到的行为发生的原因之前,不要试图提出解决方案。如果不了解问题背后的机制,任何建议的解决方案都可能是不正确的。您的代码是否已在其他线程上运行?如果不是的话,为什么把它们放在同一个程序中会使它慢下来是有道理的。你运行的系统在没有负载的情况下会自动降低时钟吗?笔记本电脑通常被配置为自动完成这项工作,而台式电脑有时也会这样设置。病理性工作负载检测可能会在您输入CPU密集的部分代码时停止运行。@JeremyFriesner:无限循环中没有可观察到的操作。@Mirko感谢您的评论。不幸的是,我不能依赖任何与硬件相关的解决方案,因为要求使用我的代码的人相应地配置他们的系统并不理想。