C 如何确定哪些内联程序集可以提供更高的执行速度?
我知道在编写一些(例如)实时应用程序时,执行速度非常重要。有时,通过编写内联程序集可以获得更高的执行速度 我想知道什么是识别以下信息的好方法: 1) 其中大部分时间是在执行算法时损失的 2) 编写内联程序集是否真的能提高执行速度C 如何确定哪些内联程序集可以提供更高的执行速度?,c,algorithm,performance,assembly,embedded,x86,C,Algorithm,Performance,Assembly,Embedded,X86,我知道在编写一些(例如)实时应用程序时,执行速度非常重要。有时,通过编写内联程序集可以获得更高的执行速度 我想知道什么是识别以下信息的好方法: 1) 其中大部分时间是在执行算法时损失的 2) 编写内联程序集是否真的能提高执行速度 提前感谢您。使用探查器确定某些相关基准测试的时间花费在哪里 不需要优化程序中不占执行时间很大一部分的部分 组件本质上是不可移植的。这是一门黑人艺术,很难掌握和维护。事实上,随着处理器体系结构的发展,需要进行维护。编译器编写者花费了巨大的努力试图利用这些改进。需要非常具体
提前感谢您。使用探查器确定某些相关基准测试的时间花费在哪里 不需要优化程序中不占执行时间很大一部分的部分 组件本质上是不可移植的。这是一门黑人艺术,很难掌握和维护。事实上,随着处理器体系结构的发展,需要进行维护。编译器编写者花费了巨大的努力试图利用这些改进。需要非常具体的情况才能保证装配级优化的成本。某些操作系统任务可能需要访问特定的程序集级指令,但生产代码很少支持这种方法
即使向量指令不应被作为C或C++程序中的内联汇编来操作,处理器厂商也提供宏来封装这些。 如果评测显示代码中存在可识别的瓶颈,那么您应该首先尝试在C中优化C代码,同时考虑可能更好的算法
如果在最后一种情况下,由于您具备必要的技能,您决定使用内联汇编,清楚地识别使用此类不可移植实现的函数,并保留纯C的替代参考实现,以便与其他体系结构进行比较和移植。当然,对生成的代码进行基准测试,并仅在收益显著时使用它 简言之: 1) 其中大部分时间是在执行算法时损失的 使用分析工具 2) 编写内联程序集是否真的能提高执行速度 也许吧,但是非常困难,而且很可能不值得付出努力 1) 其中大部分时间是在执行算法时损失的 时间不是“损失的”,只是可能被浪费了。任何算法的效率取决于许多因素,例如:- 为手头的问题选择最合适的算法
- 它的编码有多好
- 它是用什么语言编码的
- 编译器代码生成和优化的效率
- 选择适当的编译器选项
还认为编译器优化器在它生成代码的目标的体系结构和指令集中体现了大量的专门知识,并且它需要大量的时间和专业知识来以任何重要的方式打败它。p>
另一个要考虑的是汇编代码的可移植性不足。如果您的开发转移到另一个体系结构,那么所有昂贵生成的汇编代码都可能会过时,并且必须手动重新开发或移植(需要较差的维护人员真正理解代码的功能)
我一直在写硬实时和DSP系统很长一段时间,从来没有诉诸汇编性能的原因。我使用它只是为了实现在高级语言(如C)中无法完成的事情,例如操纵核心寄存器(如程序计数器和堆栈指针)(例如在实时调度器中)。在一个案例中,我研究了一个应用程序,它运行在一个200 MHz的DSP上,在汇编程序中编写了大量代码,移植到一个完全用C++编写的72MHz单片机上。这是通过更好的设计和DMA的使用相结合来实现的,DMA以采样块的形式捕获和处理信号,而不是在逐个采样的基础上,显著降低了中断率和软件开销。我有经验的另一个例子是一个完全用PIC汇编语言编写的电子换向电机应用程序,它是用C语言重新编写的,但通过更适当地使用可用的PWM和定时器/计数器硬件,C语言实现比100%汇编语言实现更精确、更高效、代码更小 实时系统较少关注执行速度,更多关注确定性行为和满足截止日期。通常,复杂的处理过程可能会延迟,因此,通常可以通过仔细的设计而不是通过微观优化来达到最后期限。通常可以利用硬件功能,如中断处理、DMA和定时器捕获来实现性能提升 通常,首先选择一个速度更快的处理器来获得所需的性能增益不仅成本更低,而且要简单得多。我认为,使用汇编程序获得必要的性能增益是绝望的最后手段,而且往往是eit的象征