【发布时间】:2013-09-04 11:16:01
【问题描述】:
我正在编写一个数字滤波器,我需要保留最后的 X 值并将它们加在一起。
现在有两种可能的方法。要么我使用memmove 移动整个数组,以便为下一个值腾出空间,并在我的求和算法中将数组的正确索引作为硬编码值。
memmove(&Fifo[0], &Fifo[1], 12 * 4); // Shift array to the left
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]);
或者,我不复制任何内存,而是增加一个计数器,并使用模运算(如循环缓冲区)从中计算每个索引。
i++; // Increment the index
Result += Factor[1] * (Fifo[(i + 5) % 13] + Fifo[(i + 7) % 13]);
Result += Factor[2] * (Fifo[(i + 4) % 13] + Fifo[(i + 8) % 13]);
Result += Factor[3] * (Fifo[(i + 3) % 13] + Fifo[(i + 9) % 13]);
Result += Factor[4] * (Fifo[(i + 2) % 13] + Fifo[(i + 10) % 13]);
Result += Factor[5] * (Fifo[(i + 1) % 13] + Fifo[(i + 11) % 13]);
Result += Factor[6] * (Fifo[(i + 0) % 13] + Fifo[(i + 12) % 13]);
由于它是嵌入式 ARM cpu,我想知道什么会更有效。由于我假设 CPU 必须在内部至少移动一个 32 位值才能进行模运算,难道仅仅移动整个数组就与计算正确的索引一样快吗?
【问题讨论】:
-
编写两个解决方案,然后对它们进行基准测试。
-
@JoachimPileborg Benchmarking 只会告诉我哪种方法更快,但我想了解为什么它会更快。
-
为此,您可能需要查看生成的代码。还要记住,与其他指令相比,函数调用可能会很昂贵。
-
@JoachimPileborg 不幸的是,我不是装配专家。
-
原因取决于您的编译器及其输出。此时您可能只需要成为装配新手即可了解具体细节。
标签: c performance embedded arm memcpy