gpt4 book ai didi

c++ - 如何提高环形缓冲区代码的性能?

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:14 25 4
gpt4 key购买 nike

我正在使用环形缓冲区来保存流式音频应用程序的样本。我从 Ken Greenebaum 的 Audio Anecdotes 2 一书中复制了环形缓冲区实现。

在对我的代码运行 Intel 的 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);
}

最佳答案

如果你能让mSize成为2的幂,你就可以替换

(mTail - mHead + mSize) % mSize

通过

(mTail - mHead) & (mSize-1)

(mHead - mTail + mSize - 1) % mSize

通过

(mHead - mTail - 1) & (mSize - 1)

关于c++ - 如何提高环形缓冲区代码的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com