相关疑难解决方法(0)

Linux内核中可能/不太可能的宏如何工作以及它们的好处是什么?

我一直在挖掘Linux内核的某些部分,发现这样的调用:

if (unlikely(fd < 0))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

要么

if (likely(!err))
{
    /* Do something */
}
Run Code Online (Sandbox Code Playgroud)

我找到了它们的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
Run Code Online (Sandbox Code Playgroud)

我知道它们是为了优化,但它们是如何工作的?使用它们可以预期性能/尺寸减少多少?至少在瓶颈代码中(当然在用户空间中)是否值得麻烦(并且可能失去可移植性).

linux gcc linux-kernel likely-unlikely

331
推荐指数
6
解决办法
13万
查看次数

可能/不太可能等同于MSVC

GCC编译器支持__builtin_expect语句,该语句用于定义可能的和不太可能的宏.

例如.

#define likely(expr)    (__builtin_expect(!!(expr), 1))
#define unlikely(expr)  (__builtin_expect(!!(expr), 0))
Run Code Online (Sandbox Code Playgroud)

是否有Microsoft Visual C编译器的等效声明,或等效的东西?

compiler-construction optimization gcc visual-studio likely-unlikely

46
推荐指数
7
解决办法
2万
查看次数

switch语句中的case的顺序是否会影响性能?

我有一个switch案例程序:

升序订单开关案例:

int main()
{
        int a, sc = 1;
        switch (sc)
        {
                case 1:
                        a = 1;
                        break;
                case 2:
                        a = 2;
                        break;
        }
}
Run Code Online (Sandbox Code Playgroud)

汇编代码:

main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 1
        mov     eax, DWORD PTR [rbp-4]
        cmp     eax, 1
        je      .L3
        cmp     eax, 2
        je      .L4
        jmp     .L2
.L3:
        mov     DWORD PTR [rbp-8], 1
        jmp     .L2
.L4:
        mov     DWORD PTR [rbp-8], 2
        nop
.L2:
        mov     eax, 0
        pop     rbp
        ret …
Run Code Online (Sandbox Code Playgroud)

c performance gcc switch-statement

31
推荐指数
5
解决办法
6911
查看次数