几年前,我参加了一个专家小组讨论相关高级嵌入式C程序员职位的候选人.
我问过的一个标准问题是优化技术.我很惊讶有些候选人没有答案.
因此,为了为后代制作一个列表,您在优化C程序时通常使用哪些技术和结构?
接受优化速度和大小的答案.
And*_*mbe 37
首先要做的事情 - 不要太早优化.花时间仔细优化一大块代码只是为了发现它不是你认为的瓶颈,这种情况并不少见.或者,换句话说"在你快速制作之前,让它发挥作用"
在优化代码之前,调查是否有任何优化算法的选项.通过优化差的算法比优化代码更容易找到性能的改进,然后在你改变算法的时候抛弃它.
并找出您首先需要优化的原因.你想要实现什么目标?例如,如果您有机会改变执行顺序以最小化时间关键区域,那么您可以尝试改善某些事件的响应时间.例如,当尝试改善对某些外部中断的响应时,您可以在事件之间的死区时间做任何准备吗?
一旦你决定需要优化代码,你会优化哪一点?使用分析器.将注意力(首先)集中在最常用的区域.
那么你可以对这些方面做些什么呢?
上面列出的大多数选项可以作为正常练习的一部分使用,没有任何不良影响.但是,如果您真的想要获得最佳性能: - 调查您可以(安全地)禁用错误检查的位置.不建议这样做,但它可以节省一些空间和周期. - 在汇编程序中手工编写代码的一部分.这当然意味着您的代码不再是可移植的,但如果这不是问题,您可以在这里找到节省.请注意,可能有时间将数据移入和移出您可以使用的寄存器(即,以满足编译器的寄存器使用).还要注意你的编译器本身应该做得很好.(当然,也有例外)
MrZ*_*bra 26
正如其他人所说:个人资料,个人资料.
至于实际技术,我还没有提到过:
热和冷数据分离:保持在CPU的缓存中非常重要.帮助实现此目的的一种方法是将数据结构拆分为频繁访问("热")和很少访问("冷")部分.
例如:假设您的客户结构如下所示:
struct Customer
{
int ID;
int AccountNumber;
char Name[128];
char Address[256];
};
Customer customers[1000];
Run Code Online (Sandbox Code Playgroud)
现在,让我们假设你想要访问ID和AccountNumber很多,但不是那么多名称和地址.你要做的是将它分成两部分:
struct CustomerAccount
{
int ID;
int AccountNumber;
CustomerData *pData;
};
struct CustomerData
{
char Name[128];
char Address[256];
};
CustomerAccount customers[1000];
Run Code Online (Sandbox Code Playgroud)
这样,当您循环遍历"customers"数组时,每个条目只有12个字节,因此您可以在缓存中容纳更多条目.如果您可以将它应用于渲染引擎的内部循环等情况,那么这可能是一个巨大的胜利.
aku*_*aku 15
我遇到的最常见的技术是:
至于一般性建议,其中大多数已经响起:
对于低级优化:
如果可能,请与 0 进行比较,而不是与任意数字进行比较,尤其是在循环中,因为与 0 的比较通常是通过单独的、更快的汇编器命令来实现的。
例如,如果可能的话,写
for (i=n; i!=0; --i) { ... }
Run Code Online (Sandbox Code Playgroud)
代替
for (i=0; i!=n; ++i) { ... }
Run Code Online (Sandbox Code Playgroud)
收集代码执行的配置文件可以让您完成 50% 的工作。另外 50% 负责分析这些报告。
此外,如果您使用 GCC 或 VisualC++,则可以使用“配置文件引导优化”,其中编译器将从以前的执行中获取信息并重新安排指令以使 CPU 更满意。
| 归档时间: |
|
| 查看次数: |
17108 次 |
| 最近记录: |