tôi đến cùng một vấn đề vì vậy tôi đã làm một vài xét nghiệm, đây là một số kết quả thu được sử dụng gcc phiên bản 3.4.6/centos 4
ac và sử dụng cc IFS, nhưng cc mất biến từ dòng lệnh để trình biên dịch không biết giá trị của "b" tại thời gian biên dịch. TC sử dụng chuyển
mã nguồn:
a.c
#include <stdint.h>
int main(){
uint32_t i,b=10,c;
for(i=0;i<1000000000;i++){
if(b==1) c=1;
if(b==2) c=1;
if(b==3) c=1;
if(b==4) c=1;
if(b==5) c=1;
if(b==6) c=1;
if(b==7) c=1;
}
}
trước Chúa
#include <stdint.h>
int main(){
uint32_t i,b=10,c;
for(i=0;i<1000000000;i++){
switch(b){
case 1:
c=1;
break;
case 2:
c=1;
break;
case 3:
c=1;
break;
case 4:
c=1;
break;
case 5:
c=1;
break;
case 6:
c=1;
break;
case 7:
c=1;
break;
}
}
}
c.c
#include <stdint.h>
int main(int argc, char **argv){
uint32_t i,b=10,c;
b=atoi(argv[1]);
for(i=0;i<1000000000;i++){
if(b==1) c=1;
if(b==2) c=1;
if(b==3) c=1;
if(b==4) c=1;
if(b==5) c=1;
if(b==6) c=1;
if(b==7) c=1;
}
}
đầu tiên chúng tôi biên dịch chương trình không có cờ tối ưu:
[email protected] ~ # gcc a.c -o a;gcc b.c -o b;gcc c.c -o c
[email protected] ~ # time ./a
real 0m4.871s
user 0m4.866s
sys 0m0.005s
[email protected] ~ # time ./b
real 0m1.904s
user 0m1.904s
sys 0m0.000s
[email protected] ~ # time ./c 10
real 0m4.848s
user 0m4.836s
sys 0m0.009s
Kết quả như tôi nghĩ, chuyển đổi nhanh hơn nếu không sử dụng tối ưu hóa trình biên dịch.
Bây giờ chúng ta biên dịch sử dụng -O2:
[email protected] ~ # gcc a.c -o a -O2;gcc b.c -o b -O2;gcc c.c -o c -O2
[email protected] ~ # time ./a
real 0m0.055s
user 0m0.055s
sys 0m0.000s
[email protected] ~ # time ./b
real 0m0.537s
user 0m0.535s
sys 0m0.001s
[email protected] ~ # time ./c 10
real 0m0.056s
user 0m0.055s
sys 0m0.000s
Surprise bất ngờ, cả hai chương trình (a.c và c.c) sử dụng IFS là nhanh hơn so với chuyển đổi (khoảng 10 lần!).
Với 'if's, trong một số trường hợp nhất định, trình biên dịch có thể tối ưu hóa cây' if' để sử dụng bảng tra cứu. Điều này ít có khả năng hơn, với các trình biên dịch hiện tại, nhưng nó không vượt quá những gì mà Standard nói. –