首页 > 解决方案 > C中的优化

问题描述

我一直在尝试优化一些简单的代码,我尝试了两种优化,循环注册和内存别名。
我的原始代码:

int paint(char *dst, unsigned n, char *src, char bias)
{
    unsigned i;
    for (i=0;i<n;i++) {
        *dst++ = bias + *src++;
    }
    return 0;
}

循环注册后我的优化代码:

int paint(char *dst, unsigned n, char *src, char bias)
{
    unsigned i;
    for (i=0;i<n;i+=2) {
       *dst++ = bias + *src++;
        *dst++ = bias + *src++;
    }
    return 0;
}

在此之后如何使用内存别名优化代码?这段代码还有其他很好的优化吗?(就像将指针转换为长指针以快速复制)

标签: cperformanceoptimizationmicro-optimization

解决方案


C中的优化比这更容易。

cc -Wall -W -pedantic -O3 -march=native -flto source.c

这将展开任何需要展开的循环。自行展开、Duff's Device 和其他技巧已经过时且毫无用处。

至于别名,您的函数使用两个char*参数。如果保证它们永远不会指向相同的数组,那么您可以使用restrict关键字。这将允许优化器假设更多关于代码的事情并使用矢量化指令。

查看此处生成的程序集:https ://godbolt.org/z/xMfebr或https://godbolt.org/z/j1xMYz

你能设法手工完成所有这些吗?可能不是。


推荐阅读