我正在使用環緩衝來保存流音頻應用程序的樣本。我從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