-O2
优化代码的情况,而右侧的数据则是开启了-fno-optimize-sibling-calls
标志,即关闭尾递归优化的-O2
优化代码。这是三次不同运行的平均值,变动似乎可以忽略不计。数值范围为1-1000,时间以毫秒为单位。编译器为MinGW g++,版本号为6.3.0。size of array with TLO(ms) without TLO(ms)
8M 35,083 34,051
4M 8,952 8,627
1M 613 609
以下是我的代码:
#include <bits/stdc++.h>
using namespace std;
int N = 4000000;
void qsort(int* arr,int start=0,int finish=N-1){
if(start>=finish) return ;
int i=start+1,j = finish,temp;
auto pivot = arr[start];
while(i!=j){
while (arr[j]>=pivot && j>i) --j;
while (arr[i]<pivot && i<j) ++i;
if(i==j) break;
temp=arr[i];arr[i]=arr[j];arr[j]=temp; //swap big guy to right side
}
if(arr[i]>=arr[start]) --i;
temp = arr[start];arr[start]=arr[i];arr[i]=temp; //swap pivot
qsort(arr,start,i-1);
qsort(arr,i+1,finish);
}
int main(){
srand(time(NULL));
int* arr = new int[N];
for(int i=0;i<N;i++) {arr[i] = rand()%1000+1;}
auto start = clock();
qsort(arr);
cout<<(clock()-start)<<endl;
return 0;
}
我听说
clock()
不是衡量时间的完美方式。但这种影响似乎是一致的。编辑:针对一条评论,我想问的问题是:请解释gcc尾调用优化器的工作原理、它是如何发生的以及我应该怎么做才能利用尾调用来加速我的程序?