我正在使用环缓冲来保存流音频应用程序的样本。我从Ken Greenebaum的Audio Anecdotes 2书中复制了ringbuffer实现。如何提高环缓冲区代码的性能?
在我的代码上运行英特尔的Vtune分析器后,它告诉我大部分时间都用于函数getSamplesAvailable()
和getSpaceAvailable()
。
任何人都可以提出建议,我怎么可能会优化这些功能呢?
RingBuffer::getSamplesAvailable(void)
{
int count = (mTail - mHead + mSize) % mSize;
return(count);
}
unsigned int RingBuffer::getSpaceAvailable(void)
{
int free = (mHead - mTail + mSize - 1)%mSize;
int underMark = mHighWaterMark - getSamplesAvailable();
int spaceAvailable = min(underMark, free);
return(spaceAvailable);
}
int RingBuffer::push(int value)
{
int status = 1;
if(getSpaceAvailable()) {
// next two operations do NOT have to be atomic!
// do NOT have to worry about collision with _tail
mBuffer[mTail] = value; // store value
mTail = ++mTail % mSize; // increment tail
} else {
status = 0;
}
return(status);
}
int RingBuffer::pop(int *value)
{
int status = 1;
if(getSamplesAvailable()) {
*value = mBuffer[mHead];
mHead = ++mHead % mSize; // increment head
} else {
status = 0;
}
return(status);
}
谷歌为“虚拟环缓冲区”。我不知道你是否可以在你的操作系统上实现它,但当你需要一个真正的快速缓冲区时,它是一个非常好的选择。 – PlasmaHH