【问题标题】:Is this the most optimal way to shift?这是最理想的转变方式吗?
【发布时间】:2013-09-02 15:33:24
【问题描述】:

我有以下过滤器代码:

// Shift array to the left
memmove(&Fifo[0], &Fifo[1], 12 * 4);

// Add new value
Fifo[12] = NewValue;

int Result = Factor[0] * Fifo[6];

Result += Factor[1] * (Fifo[5] + Fifo[7]);
Result += Factor[2] * (Fifo[4] + Fifo[8]);
Result += Factor[3] * (Fifo[3] + Fifo[9]);
Result += Factor[4] * (Fifo[2] + Fifo[10]);
Result += Factor[5] * (Fifo[1] + Fifo[11]);
Result += Factor[6] * (Fifo[0] + Fifo[12]);

有什么办法可以重写它,这样我就不必在每次调用时复制这么多内存来提高性能?我考虑过循环缓冲区和链表,但它需要更多额外的代码和复杂性,看来上面是最好的选择。

【问题讨论】:

  • 循环缓冲区是这里的样板。给它一个 2 个元素的幂,比如 16,所以当你增加它的时候用简单的 AND 包装索引是微不足道的。

标签: c arrays linked-list c99 circular-buffer


【解决方案1】:

您可以通过简单地保留一个带有索引的额外变量来实现循环缓冲区,例如缓冲区的开头,并相对于该索引对 Fifo 进行所有引用(模 13 - 谢谢,Ingo!);这样一来,换档只会影响该指数。

【讨论】:

  • 这是一个非常慢的嵌入式 ARM cpu,因此可能是模运算使代码的性能比 'memmove' 调用更差,但我想这将是对两者进行基准测试的问题。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2018-09-20
  • 1970-01-01
  • 2021-03-31
  • 2013-10-26
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多