Pap*_*obi 2 c optimization for-loop
我正在尝试学习如何优化我的c代码,所以我在互联网上找到了一些文章并重新编写了我的功能,以便它可以更快地执行.当我在没有优化标志的情况下编译它时(第二个函数比第一个函数快约12%),但是当我使用它与gcc -O3时,第二个函数要慢得多(约50%).你知道为什么会这样吗?谢谢你的帮助.
第一个功能:
typedef struct {
    double *data;
    int rows;
    int columns;
} Matrix;
Matrix *matrixMultiplication(Matrix *a, Matrix *b) {
    if(a->columns != b->rows)
        return NULL;
    Matrix *matrix = createMatrix(a->rows, b->columns);
    set(0, matrix);
    for(int i = 0; i < matrix->rows; i++) {
        for(int j = 0; j < a->columns; j++) {
            for(int k = 0; k < b->columns; k++) {
                matrix->data[i * matrix->columns + k] += a->data[i * a->columns + j] * b->data[j * b->columns + k];
            }
        }
    }
    return matrix;
}
第二功能:
typedef struct {
    float *data;
    unsigned int rows;
    unsigned int columns;
} Matrix_2;
unsigned int matrixMultiplication_2(Matrix_2 *a, Matrix_2 *b, Matrix_2 **c) {
    Matrix_2 *matrix;
    if(a->columns != b->rows)
        return 0;
    createMatrix_2(a->rows, b->columns, &matrix);
    set_2(0, matrix);
    for(unsigned int i = matrix->rows; i--;) {
        for(unsigned int j = a->columns; j--;) {
            for(unsigned int k = b->columns; k--;) {
                matrix->data[i * matrix->columns + k] += a->data[i * a->columns + j] * b->data[j * b->columns + k];
            }
        }
    }
    *c = matrix;
    return 1;
}
那是因为编译器优化基于模式识别.您的编译器知道大量典型的代码模式,并知道如何转换它们以产生更快的代码.然而,虽然这个代码模式库非常广泛,但它是有限的.
第一个函数使用规范for(int i = 0; i < count; i++)循环控件.你可以打赌任何值得盐的编译器都有这样的模式,产生接近环路控制的最佳代码.
第二个函数使用人类代码中很少见到的模式.虽然我个人喜欢这种模式的简洁,但有很多程序员发现它使用起来太神秘了.显然,您的编译器没有为此提供优化器模式,因此生成的代码无法完全优化.
像更换优化for(int i = 0; i < count; i++)与for(int i = count; i--;)是有用的当C仍然比一个高层次的汇编而已.但是编译器优化很快就将代码转换变成了一个太复杂的野兽,无法通过这些技巧进行优化.今天,大多数优化都需要在算法级别上完成.翻译级优化通常应留给编译器,并通过编写编译器可以优化的规范代码来培养.