c -我怎么能告诉编译器选择更快的两个实现?



假设我有两个可能的代码路径。假设它们甚至有明显的不同(即它们返回不同的输出)。我想用更快的路径。因为我不知道哪一个更快,编译器应该选择它认为更好的一个。我如何告诉编译器为我做这些?

考虑这个简化的例子:

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搜索+网络+页面=

在你的平台上测试不同的版本,然后为特定的一个选择最快的一个,并使用#ifs

#define PLATFORM2
/*...*/
#if defined(PLATFORM1)
code_for_platform1();
#elif defined(PLATFORM2)
code_for_platform2();
#else
code_for_platform3();
#endif

相关内容

  • 没有找到相关文章

最新更新