簡體   English   中英

使用-O2可以減少氣泡排序C程序的時間

[英]using -O2 decreases time of bubble sort C program

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void sort();

int main() {
    int i;
    for (i = 0; i < 100000; i++) {
        sort();
    }
}

void sort() {
    int i, j, k, array[100], l = 99, m;
    for (i = 0; i < 100; i++) {
        array[i] = rand() % 1000 + 1;
    }
    for (k = 0; k < 99; k++) {
        for (j = 0; j < l; j++) {
            if (array[j + 1] > array[j]) {
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
        l--;
    }
    for (m = 0; m < 100; m++) {
        printf("%d ", array[m]);
    }
}

在linux shell上, gcc sort -o sort.c然后time ./sort >> out 在這里,如果我執行gcc -o2 sort -o sort.c以及類似的o3o4那么時間將繼續減少。 優化選項如何工作? 請解釋所有實時,用戶時間和系統時間。

PS:代碼可能效率不高。 請忽略這一點。

優化選項在讀取源代碼和將二進制指令寫入CPU之間起作用。

GCC是一個多階段編譯器,其中的階段大致包括:

  1. 從輸入文本創建“令牌”。
  2. 將這些標記排列成抽象語法樹結構。
  3. 修剪抽象語法樹。
  4. 假設CPU寄存器數量無限,創建基於寄存器的指令。
  5. 將寄存器映射到可用的實際寄存器中。
  6. 以加載程序的預期格式寫出二進制信息。

優化會影響許多位置,通常它們會在上述步驟3到5中生效。有許多優化,包括:

  • 恆定折疊-預先評估恆定的子表達式。
  • 降低強度–用更快的速度代替慢速操作。
  • 空序列–刪除無用的操作。
  • 合並操作–用一個等效項替換多個操作。
  • 代數定律–使用代數定律來簡化或重新排列說明。
  • 特殊情況說明–使用為特殊操作數情況設計的說明。
  • 地址模式操作–使用地址模式簡化代碼。
  • 循環展開-用等效指令替換循環
  • 部分循環展開-減少循環的次數,同時保留整體功能。

請注意,這些並不是所有可能執行的優化,但它開始為您提供一個思路。

例如,如果編譯器看到

int s = 3;
while (s < 6) {
   printf("%d\n", s);
   s++;
}

並且將這些標志設置為展開循環,那么它可能會寫入與

printf("%d\n", 3);
printf("%d\n", 4);
printf("%d\n", 5);

這些指令對我們來說似乎比較羅more,但CPU命令可能更小,因為無需“查找”現在擦除的s值,也不需要向其添加一個值或存儲新的值。更新后的值返回到RAM。

GCC將優化分為“安全”到“風險”兩大類。 -O2是速度和安全性之間的良好折衷。 -O數越高,風險越高。

-O代表optimize ,其中gcc將自動采取必要的步驟來優化您的程序。 您可以在此處閱讀有關GCC優化程序的具體步驟的更多信息: https : //gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

但實際上-O2-O1更優化, -O3-O2更優化。 在編譯的二進制大小方面,這可能會帶來一些缺陷,在這種情況下,生成的二進制文件可能會占用更多空間,但運行速度更快,反之亦然。 您實際上可以將代碼粘貼到https://godbolt.org/ ,並在-O1或下拉菜單旁邊的任何優化選項中進行選擇,以選擇編譯器,然后godbolt會向您顯示生成的代碼。 您將能夠看到O1O2之間的區別,即O2生成的代碼可能更短,並且將使用許多快捷方式來執行算法。

-O編譯器標志控制希望編譯器執行的編譯器優化量。 簡而言之,構建項目將花費更長的時間,但是生成的可執行文件應該更快。 有關更多信息,請在命令提示符下鍵入man gccgcc -c -Q -O3 --help=optimizers以獲取有關針對特定標志執行的gcc -c -Q -O3 --help=optimizers的特定信息。

gcc提供了許多優化標志。 您可以在此處查看每個人的具體操作:

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

總是需要在優化上進行權衡,要么增加編譯時間,要么增加內存使用量,等等。

-o2標志啟用了許多優化,因此可能尚不清楚哪些特定的優化會影響排序。 可以使用-falign-loops標志,而不是-o2來單獨嘗試每種優化,以查看是否可以提高性能。

暫無
暫無

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

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