我正在使用 C 语言进行数学软件开发中的标准
gcc
编译器。我对编译器或编译器选项了解不多,我只是想知道,是否可以使用另一个编译器或选择更好的选项来制作更快的可执行文件?默认的 Makefile 设置选项 -ffast-math
和 -O3
,我认为它们都对整体计算时间有一些影响。我的软件相当广泛地使用内存,所以我想一些与内存管理相关的选项可能会起作用?
有什么想法吗?
在尝试不同的编译器或随机、任意的微优化之前,您确实需要一个像样的分析器并profile您的代码以准确找出性能瓶颈。实际的图片可能与您想象的有很大不同。一旦您有了配置文件,您就可以开始考虑哪些可能有用的优化。例如。如果您受到内存带宽的限制,更改编译器不会对您有帮助。
以下是有关 gcc 性能的一些提示: 使用 -Os、-O2 和 -O3 进行基准测试。有时 -O2 会更快,因为它使代码更短。既然您说您使用了大量内存,请也尝试使用 -Os 并进行测量。
还要检查客户端计算机上的 -march=native 选项(如果您要为具有类似处理器的计算机制作可执行文件,则认为可以安全使用)。有时它会对性能产生相当大的影响。如果您需要列出 gcc 与本机一起使用的选项列表,请按以下步骤操作:
制作一个名为 test.c 的小 C 程序,然后
$ touch test.c
$ gcc -march=native -fverbose-asm -S test.c
$ cat test.s
代码请转至 Gentoo 论坛用户。 它应该打印出 gcc 使用的所有优化的列表。请注意,如果您使用 i7,gcc 4.5 会将其检测为 Atom,因此您需要手动设置 -march 和 -mtune。
另请阅读此文档,它会对您有所帮助(不过,根据我在 Gentoo 上的经验,-march=native 效果更好)http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html
您可以尝试使用 4.4 晚期和 4.5 早期版本中的新选项,例如 -flto 和 -fwhole-program。这些应该有助于提高性能,但是在尝试它们时,我的系统不稳定。无论如何,也请阅读此文档,它将帮助您了解 GCC 的一些优化选项 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
正如您所说,您的程序内存很重,您可以测试使用与您平台上的标准库中的不同的 malloc 实现。 例如,您可以尝试 jemalloc (http://www.canonware.com/jemalloc/)。
请记住,通过更改编译器或设置获得的大多数改进只会使您成比例的加速,而调整算法有时可以在程序的
O()
中获得改进。在投入大量精力调整设置之前,请务必先将其耗尽。