用于提高代码优化性能的编译器选项
compiler options to increase optimization performance of the code
我正在将代码从 INTEL 架构移植到 ARM 架构。我试图在 centos 上使用 arm 交叉编译器构建相同的代码。是否有任何编译器选项可以提高可执行映像的性能,因为 INTEL 上的映像可能无法在 ARM 上提供类似的性能。有没有办法做到这一点?
GCC 中存在许多优化选项。默认情况下,编译器会尝试使编译过程尽可能短,并生成使调试容易的目标代码。然而,gcc 也提供了几个优化选项。
GCC 中提供了四种通用级别的性能增量优化,可以通过传递 -O0
、-O1
、-O2
或 -O3
选项之一来激活.这些级别中的每一个都会激活一组优化,这些优化也可以通过指定相应的命令行选项手动激活。例如,对于 -O1
,编译器使用 递减和分支 指令(如果可用和适用)执行分支,而不是递减寄存器,将其与零进行比较并在单独的指令中进行分支。这个 减量和分支 也可以通过传递 -fbranch-count-reg
选项手动指定。考虑到在每个级别执行的优化也取决于目标体系结构,您可以通过 运行 GCC 的 -Q --help=optimizers
选项获得可用和启用的优化列表。
一般来说,优化级别对应于(请注意,在每个级别上还应用了先前级别的优化):
-O0
:默认级别,编译器会尝试减少编译时间并生成易于调试器处理的目标代码
-O1
:编译器试图减少代码大小和执行时间。仅执行不占用大量编译时间的优化。编译可能会占用更多内存。
-O2
:编译器应用几乎所有不影响代码大小的可用优化。编译需要更多时间,但性能应该会提高。
-O3
:编译器还应用可能增加代码大小的优化(例如内联函数)
有关所有优化选项的详细说明,您可以查看here。
作为一般性评论,请考虑编译器优化旨在在一般情况下工作,但它们的有效性将在很大程度上取决于您的编程和您所处的体系结构运行。
编辑:
如果您对内存分页优化感兴趣,可以使用 -freorder-blocks-and-partition
选项(也可以通过 -O2
激活)。此选项对每个函数内的基本块重新排序,以将它们划分为 热块 (经常调用)和 冷块(很少调用)。 热块 然后被放置在连续的内存位置。这应该会增加缓存位置和分页性能。
我正在将代码从 INTEL 架构移植到 ARM 架构。我试图在 centos 上使用 arm 交叉编译器构建相同的代码。是否有任何编译器选项可以提高可执行映像的性能,因为 INTEL 上的映像可能无法在 ARM 上提供类似的性能。有没有办法做到这一点?
GCC 中存在许多优化选项。默认情况下,编译器会尝试使编译过程尽可能短,并生成使调试容易的目标代码。然而,gcc 也提供了几个优化选项。
GCC 中提供了四种通用级别的性能增量优化,可以通过传递 -O0
、-O1
、-O2
或 -O3
选项之一来激活.这些级别中的每一个都会激活一组优化,这些优化也可以通过指定相应的命令行选项手动激活。例如,对于 -O1
,编译器使用 递减和分支 指令(如果可用和适用)执行分支,而不是递减寄存器,将其与零进行比较并在单独的指令中进行分支。这个 减量和分支 也可以通过传递 -fbranch-count-reg
选项手动指定。考虑到在每个级别执行的优化也取决于目标体系结构,您可以通过 运行 GCC 的 -Q --help=optimizers
选项获得可用和启用的优化列表。
一般来说,优化级别对应于(请注意,在每个级别上还应用了先前级别的优化):
-O0
:默认级别,编译器会尝试减少编译时间并生成易于调试器处理的目标代码-O1
:编译器试图减少代码大小和执行时间。仅执行不占用大量编译时间的优化。编译可能会占用更多内存。-O2
:编译器应用几乎所有不影响代码大小的可用优化。编译需要更多时间,但性能应该会提高。-O3
:编译器还应用可能增加代码大小的优化(例如内联函数)
有关所有优化选项的详细说明,您可以查看here。
作为一般性评论,请考虑编译器优化旨在在一般情况下工作,但它们的有效性将在很大程度上取决于您的编程和您所处的体系结构运行。
编辑:
如果您对内存分页优化感兴趣,可以使用 -freorder-blocks-and-partition
选项(也可以通过 -O2
激活)。此选项对每个函数内的基本块重新排序,以将它们划分为 热块 (经常调用)和 冷块(很少调用)。 热块 然后被放置在连续的内存位置。这应该会增加缓存位置和分页性能。