[英]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
以及類似的o3
和o4
那么時間將繼續減少。 優化選項如何工作? 請解釋所有實時,用戶時間和系統時間。
PS:代碼可能效率不高。 請忽略這一點。
優化選項在讀取源代碼和將二進制指令寫入CPU之間起作用。
GCC是一個多階段編譯器,其中的階段大致包括:
優化會影響許多位置,通常它們會在上述步驟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
會向您顯示生成的代碼。 您將能夠看到O1
和O2
之間的區別,即O2
生成的代碼可能更短,並且將使用許多快捷方式來執行算法。
-O
編譯器標志控制希望編譯器執行的編譯器優化量。 簡而言之,構建項目將花費更長的時間,但是生成的可執行文件應該更快。 有關更多信息,請在命令提示符下鍵入man gcc
或gcc -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.