C 51_C语言性能优化之循环优化

一、for 循环性能优化

1.1 循环展开

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 一般计算正整数阶乘:
unsigned long int calc(unsigned long int n)
{
    unsigned long int fact = 1;
    unsigned long int i;
    for (i = 1; i < n + 1; i++) {
        fact *= i;
        // printf("i: %lu\n", i);
    }

    return fact;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 优化后的计算正整数阶乘:
unsigned long int calc1(unsigned long int n)
{
    // C语言中,register关键字的作用是建议编译器,尽可能地把变量存放在寄存器中,以加快其访问速度。
    register unsigned long int fact0 = 1, fact1 = 1, fact2 = 1, fact3 = 1;
    unsigned long int i = 1;
    unsigned long int lp = n - n % 4;
    // printf("lp: %lu\n", lp);
    for (; i < lp; i += 4) {
        fact0 *= i;
        // printf("i: %lu\n", i);
        fact1 *= (i + 1);
        // printf("i: %lu\n", i+1);
        fact2 *= (i + 2);
        // printf("i: %lu\n", i+2);
        fact3 *= (i + 3);
        // printf("i: %lu\n", i+3);
    }

    // printf("iii: %lu\n", i);
    // i++;
    for (; i < n + 1; i++)
    {
        fact0 *= i;
        // printf("i: %lu\n", i);
    }

    return fact0 * fact1 * fact2 * fact3;
}
Licensed under CC BY-NC-SA 4.0