2008-09-15 26 views
2

您可以编写一个函数,然后查看生成的程序集,您会发现它可以得到改进。重构拆解代码

为了便于阅读,您希望保留您编写的函数,但是您希望将自己的程序集替换为编译器。有没有什么方法可以在你的高级语言功能和新装配之间建立关系?

回答

3

如果你正在查看程序集,那么它的公平假设你已经很好地理解了如何编译代码。如果你有这方面的知识,那么它有时可能会将“改变工程师”的改变恢复为原来的语言,但最好不要打扰。

与首次进行这些更改所需的时间和精力相比,您所做的优化可能非常小。我建议你把这种工作交给编译器去喝杯茶。如果这些变化很重要,并且性能非常重要(就像在嵌入式世界中那样),那么您可能希望以某种方式将正常代码与组合进行混合,然而,在大多数计算机和芯片上,性能通常足以避免这令人头痛。

如果你真的需要更多的性能,那么优化代码而不是程序集。

2

没有,我想。你已经拒绝了编译器的工作以支持你自己的工作。您最好还是抛弃使用编译语言编写的函数,因为现在您所拥有的仅仅是您在该平台上的汇编程序。

我强烈建议不要参与这种优化,因为除非您确定,通过分析和分析,您确实有所作为。

1

它取决于你编写函数的语言。一些像C这样的语言是非常低级的,将每个函数调用或语句翻译成特定的汇编语句。如果您确实使用C,则可以使用内联汇编替换您的函数以提高性能。

其他高级语言可能会将每个语句转换为宏程序或程序集端的其他更复杂的调用。某些优化(如尾递归,循环展开等)可以很容易地在源端实现,但其他(如更有效地使用寄存器文件)可能是不可能的(再次,取决于您使用的语言和编译器使用)。

1

很难说修改后的程序集与生成未修改版本的源代码之间有任何关系。它肯定会混淆调试工具:寄存器内容将不再匹配它们应该对应的源变量。

数据包处理代码中有许多地方我已经检查了生成的程序集并返回来更改原始源代码以改进结果。重新安排源可以减少分支的数量,__attribute__和编译器参数可以对齐分支点和函数以减少I $未命中。在绝望的情况下,可以使用一个小内联汇编,以便二进制文件仍然可以从源代码编译。

1

你可以尝试的东西是将你的原始函数分离到它自己的文件中,并提供一个make规则从那里构建汇编程序。然后使用改进后的版本更新汇编程序文件,并提供一个make规则以从汇编程序文件构建一个目标文件。然后更改您的链接规则以包含该对象文件。

如果您只更改过汇编程序文件,那将继续使用。如果您更改原始的高级语言文件,汇编程序文件将被重新构建,而目标文件则由新版本(未改进版本)构建。

这给你两者之间的关系;您可能希望在更高级别语言文件的顶部添加警告注释以警告有关行为。如果你在这里犯了一个错误,使用某种形式的VCS将使你能够恢复改进的汇编文件。

1

如果你正在写在Visual C++的本机应用程序编译,有两种方法:

  1. 使用__asm { }块,并在那里写你的汇编。
  2. MASM汇编程序中编写函数,汇编为.obj,并将其作为静态库链接。在您的C/C++代码中,用extern "C"声明声明该函数。

其他C/C++编译器有类似的方法。

1

在这种情况下,通常有两种选择:优化代码或重写编译器。我看不出在哪里打破源代码和操作系统之间的联系永远是正确的解决方案。