【发布时间】:2014-10-28 23:50:25
【问题描述】:
我有一个具有时间关键 ISR 的嵌入式应用程序,它需要遍历一个大小为 256 的数组(最好是 1024,但 256 是最小值)并检查一个值是否与数组内容匹配。在这种情况下,bool 将设置为 true。
微控制器是 NXP LPC4357,ARM Cortex M4 内核,编译器是 GCC。我已经组合了优化级别 2(3 更慢)并将函数放在 RAM 中而不是闪存中。我还使用指针算术和for 循环,它进行向下计数而不是向上计数(检查i!=0 是否比检查i<256 是否更快)。总而言之,我最终得到了 12.5 µs 的持续时间,必须大幅减少才能可行。这是我现在使用的(伪)代码:
uint32_t i;
uint32_t *array_ptr = &theArray[0];
uint32_t compareVal = 0x1234ABCD;
bool validFlag = false;
for (i=256; i!=0; i--)
{
if (compareVal == *array_ptr++)
{
validFlag = true;
break;
}
}
做到这一点绝对最快的方法是什么?允许使用内联汇编。其他“不太优雅”的技巧也是允许的。
【问题讨论】:
-
有没有办法以不同的方式将值存储在数组中?如果您可以对它们进行排序,那么二进制搜索肯定会更快。如果要存储和搜索的数据在一定范围内,可以用位图等表示。
-
@BitBank:你会惊讶于编译器在过去 30 年中的进步。 ARM 特别是对编译器非常友好。而且我知道 GCC 上的 ARM 可以发出加载多个指令(至少从 2009 年开始)
-
很棒的问题,人们忘记了现实世界中存在性能很重要的案例。太多次这样的问题都是用“just use stl”来回答的
-
标题“...遍历数组”具有误导性,因为您实际上只是在搜索给定值。遍历数组意味着要对每个条目进行一些操作。如果成本可以分摊到多次搜索中,排序确实是一种独立于语言实现问题的有效方法。
-
您确定不能简单地使用二进制搜索或哈希表吗?对 256 个项目进行二分搜索 == 8 次比较。哈希表 == 平均 1 次跳跃(如果您有完美的哈希,则为 1 次跳跃 max)。只有在 1) 有一个不错的搜索算法(
O(1)或O(logN),与O(N)相比),并且 2) 你已经将其描述为瓶颈之后,你才应该诉诸汇编优化。
标签: c optimization assembly embedded arm