c - 如何确定内联汇编在何处/针对什么可以提供更高的执行速度?

标签 c algorithm performance assembly embedded

我知道在编写一些(例如)实时应用程序时,执行速度非常重要。有时可以通过编写内联汇编来获得更高的执行速度。

我想知道什么是识别的好方法:

1) 大部分时间都浪费在执行算法上

2)编写内联汇编是否真的能提高执行速度

提前谢谢您。

最佳答案

1) where most of the time is lost executing an algorithm

时间并不是“失去”,而可能只是“浪费”。任何算法的效率都取决于许多因素,例如:

  • 选择最适合当前问题的算法,
  • 编码的质量如何,
  • 它是用什么语言编码的,
  • 编译器代码生成和优化的效率,
  • 选择适当的编译器选项。

也就是说你的问题无法回答。它通常是根据具体情况使用相关代码的分析来确定的,但在跳转到汇编代码之前可以做很多事情。选择或实现不当的算法可能会在汇编代码中运行得更快,但它仍然是一个糟糕的选择和/或实现,只需正确执行即可获得更好的结果。

2) whether writing inline assembly will really enhance execution speed

首先要考虑的是您编写汇编代码的能力如何,以及您对特定目标的指令集的熟悉程度如何?或者也许您需要聘请专家才能获得真正的好处,费用有多高。

您准备花费多少时间来手工编写汇编代码,然后才发现自己无法实现任何显着有用的好处,或者这样做所花费的时间无论如何都会导致您的项目失败。

还要考虑到,编译器优化器在为其生成代码的目标的体系结构和指令集方面体现了大量专业知识,并且需要大量时间和专业知识才能以任何重要方式击败它。

另一个需要考虑的事情是汇编代码缺乏可移植性。如果您的开发转移到不同的架构,所有昂贵生成的汇编代码可能会变得过时,并且必须重新开发或手动移植(要求糟糕的维护者真正理解代码的作用)。

我长期以来一直在编写硬实时和 DSP 系统,并且从未出于性能原因而求助于汇编程序。我仅使用它来实现高级语言(例如 C)无法完成的事情,例如操作程序计数器和堆栈指针等核心寄存器(例如在实时调度程序中)。在一个案例中,我开发了一个在 200MHz DSP 上运行的应用程序,其中大量用汇编程序编写的代码被移植到完全用 C++ 编写的 72MHz MCU。这是通过更好的设计和使用 DMA 相结合来实现的,以捕获和处理样本 block 中的信号,而不是逐个样本地捕获和处理信号,从而显着降低中断率和软件开销。我经历过的另一个例子是完全用 PIC 汇编器编写的电子换向电机应用程序,该应用程序用 C 语言重新编写,但通过更适本地使用可用的 PWM 和定时器/计数器硬件,C 实现更加精确、高效,并且尺寸更小。 100% 汇编程序实现的代码大小。

实时系统不太关注执行速度,而更关注确定性行为和按时完成任务。通常复杂的处理可以被推迟,因此通常可以通过仔细的设计而不是通过微观优化来满足最后期限。通常可以利用中断处理、DMA 和定时器捕获等硬件功能来实现性能提升。

通常,通过首先选择更快的处理器来获得所需的性能增益,成本更低且更简单。我建议使用汇编程序来获得必要的性能提升是绝望的最后手段,并且通常表明软件设计和/或实现不佳或处理器选择不当。

关于c - 如何确定内联汇编在何处/针对什么可以提供更高的执行速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40330232/

相关文章:

CS50 IDE clang : error: linker command failed with exit code 1

python - 在具有不同重数但相同维度的数组上同时使用 numpy repeat

javascript - 使用原型(prototype)的最佳方式 [OOP]

c - 如何在清除标准输入之前检查标准输入是否为空

c - 没有从输入文件打印正确的值

algorithm - 使用通配符 (GLOB) 支持搜索数百万个文件名的更好方法是什么

ruby - 在 ruby​​ 中寻找可出租元素的理想利用

c++ - C++ 类中的许多成员函数对性能有影响吗?

c - 如何修复我的 C 程序中的内存错误?

algorithm - 带有删除元素的排序队列