c# 我如何告诉编译器选择两个实现中较快的一个?

db2dz4w8  于 2023-04-04  发布在  C#
关注(0)|答案(2)|浏览(204)

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

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,但是任何编译器都可以,只要它支持这种情况。

tp5buhyn

tp5buhyn1#

在您的平台上对不同的版本进行基准测试,然后为特定的版本选择最快的版本,并使用#if s

#define PLATFORM2

/*...*/

#if defined(PLATFORM1)
   code_for_platform1();
#elif defined(PLATFORM2)
   code_for_platform2();
#else
   code_for_platform3();
#endif
vmjh9lq9

vmjh9lq92#

您可以使用宏来实现此目的,这些宏由各自操作系统上的编译器定义。通过使用以下代码,仅执行适用于各自操作系统的函数,例如,如果代码在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

然后,你可以得出更快的结论。

相关问题