假设我有两个可能的代码路径。假设它们甚至有明显的不同(即它们返回不同的输出)。我想用更快的路径。因为我不知道哪一个更快,编译器应该选择它认为更好的一个。我如何告诉编译器为我做这些?
考虑这个简化的例子:
int F (int i) {
if (this is more likely to be faster in some current environment) {
return i * i;
} else {
return i * 2 + 1;
}
}
两个代码路径都是有效的解。是的,它们返回不同的结果。这很好,只要在程序运行期间只选择一条路径即可。我只是希望编译器选择一个可能更快的。我知道这是一个不寻常的场景。
我使用gcc, clang和msvc,但任何编译器都可以,只要它支持这个场景。
您可以为此目的使用宏,这些宏由编译器在各自的操作系统上定义。通过使用下面的代码,只执行那些适合于各自操作系统的函数,例如。,如果代码在Windows操作系统下执行,function_for_windows()
将执行ONLY.
#if defined __linux__ || defined linux || defined __linux
function_for_linux();
#elif _WIN32 || defined _WIN64 || defined __CYGWIN__
function_for_windows();
#elif defined __unix__ || defined __unix || defined unix
function_for_unix();
#elif defined __APPLE__ || defined __MACH__
function_for_mac();
#elif defined __ANDROID__
function_for_android();
#endif
然后,你可以得出更快的结论。
您可以在编译程序时使用-fprofile-generate
选项生成分析信息,然后在使用优化再次编译程序时使用-fprofile-use
选项使用该信息。
gcc -O3 -fprofile-generate test.c -o test
./test < input.txt
gcc -O3 -fprofile-use test.c -o test
第一个命令在程序编译时启用分析,并将分析数据保存在扩展名为
.gcda
的文件中。使用代表性的输入,第二个命令运行程序并生成配置文件数据,这些数据保存在扩展名为
.gcno
的文件中。[可选,如果你的程序不需要任何输入。]第三个命令借助分析数据重新编译程序以优化程序。
<一口>来源:https://man7.org/linux/man-pages/man1/gcc.1.html一口>
<一口>来源:https://www.google.com/search?q=fprofile-generate& man7.org sitesearch = % 2 flinux % 2 fman-pages& sa搜索+网络+页面=一口>
在你的平台上测试不同的版本,然后为特定的一个选择最快的一个,并使用#if
s
#define PLATFORM2
/*...*/
#if defined(PLATFORM1)
code_for_platform1();
#elif defined(PLATFORM2)
code_for_platform2();
#else
code_for_platform3();
#endif