我正在制作音频"实时"应用程序,我想改善它的性能。我实际上已经发布了一个主题,但这是关于std :: thread特定的。
音频处理主要由两个单独的对象(leftProcessor
轨道和rightProcessor
)完成。由于这些对象并不相互依赖,因此使用两个线程来处理它们应该可以通过多核CPU来提高性能。但是,我目前得到了相反的结果。
在我激活编译器性能优化(O2)之前,使用两个线程使我的性能提高了约50%,但在我开启优化后,性能降低了约10-20%,而性能却大大提高了两个版本。
我通过在功能中的两个点花费时间来测量性能,并将结果强制打印到屏幕上,因此可能存在一些问题。 ;)
我的猜测是创建一个std::thread
会花费更多的时间,而不是在第二个线程上运行处理。
在这种情况下,是否可以通过使用相同的"线程来提高性能。对于每个函数调用,只是传递线程的新参数?我不知道这是否可能。
该功能目前需要大约0.0005ms到0.002ms来处理。
以下是代码:
void AudioController::processAudio(int frameCount, float *output) {
#ifdef AUDIOCONTROLLER_MULTITHREADING
// CALCULATE RIGHT TRACK
std::thread rightProcessorThread;
if(rightLoaded) {
rightProcessorThread = std::thread(&AudioProcessor::tick, //function
rightProcessor, //object
rightFrameBuffer, //arg1
frameCount); //arg2
} else {
for(int i = 0; i < frameCount; i++) {
rightFrameBuffer[i].leftSample = 0.0f;
rightFrameBuffer[i].rightSample = 0.0f;
}
}
#else
// CALCULATE RIGHT TRACK
if(rightLoaded) {
rightProcessor->tick(rightFrameBuffer, frameCount);
} else {
for(int i = 0; i < frameCount; i++) {
rightFrameBuffer[i].leftSample = 0.0f;
rightFrameBuffer[i].rightSample = 0.0f;
}
}
#endif
// CALCULATE LEFT TRACK
Frame * leftFrameBuffer = (Frame*) output;
if(leftLoaded) {
leftProcessor->tick(leftFrameBuffer, frameCount);
} else {
for(int i = 0; i < frameCount; i++) {
leftFrameBuffer[i].leftSample = 0.0f;
leftFrameBuffer[i].rightSample = 0.0f;
}
}
#ifdef AUDIOCONTROLLER_MULTITHREADING
// CALCULATE RIGHT TRACK
if(rightLoaded) {
rightProcessorThread.join();
}
#endif
// MIX
for(int i = 0; i < frameCount; i++ ) {
leftFrameBuffer[i] = volume * (leftRightMix * leftFrameBuffer[i] + (1.0 - leftRightMix) * rightFrameBuffer[i]);
}
}