簡體   English   中英

C for循環優化

[英]C for loops optimization

我試圖學習如何優化我的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++)循環控制。 您可以打賭,任何值得贊揚的編譯器都會為此提供模式,從而為循環控制產生接近最佳的代碼。

第二個功能使用的模式在人工代碼中很少見。 盡管我個人很喜歡這種模式的簡潔性,但仍有許多程序員認為它過於神秘而無法使用。 顯然,您的編譯器沒有為此提供優化器模式,因此生成的代碼沒有得到完全優化。


當C仍然只是高級匯編程序時,諸如for(int i = 0; i < count; i++)替換for(int i = count; i--;)的優化非常有用。 但是長期以來,編譯器優化已將代碼轉換變成過於復雜的野獸,無法通過此類技巧進行優化。 今天,大多數優化都需要在算法層面上完成。 翻譯級別的優化通常應留給編譯器,並通過編寫編譯器可以優化的規范代碼來促進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM