Không trả lời câu hỏi nhưng đưa ra ví dụ về tối ưu hóa thời gian biên dịch. gcc tối ưu hóa mã khi được yêu cầu làm như vậy. Tùy chọn -O (Tối ưu hóa) cho phép tối ưu hóa ở các mức leves khác nhau. Nó có thể được sử dụng như -O1, -O2 và -O3. Trang người dùng gcc mô tả chính xác ý nghĩa của từng cấp.
Tùy chọn -S dịch C thành lắp ráp và lưu trên tệp .s.
test.c
#include <stdio.h>
int abc;//Global variable
void main()
{
abc = 3;
if(abc == 3)
printf("abc will be always 3");
else
printf("This will never executed");
}
whitout gcc tối ưu hóa hai chuỗi xuất hiện trên mã lắp ráp.
$ gcc -S test.c; mèo test.s
.file "test.c"
.comm abc,4,4
.section .rodata
.LC0:
.string "abc will be always 3"
.LC1:
.string "This will never executed"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $3, abc(%rip)
movl abc(%rip), %eax
cmpl $3, %eax
jne .L2
movl $.LC0, %eax
movq %rax, %rdi
movl $0, %eax
call printf
jmp .L1
.L2:
movl $.LC1, %eax
movq %rax, %rdi
movl $0, %eax
call printf
.L1:
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.6.1 20110908 (Red Hat 4.6.1-9)"
.section .note.GNU-stack,"",@progbits
Whit mức gcc 1 tối ưu hóa chỉ có một chuỗi được dịch sang lắp ráp
$ gcc -O1 -S thử nghiệm. c; cat test.s
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "abc will be always 3"
.text
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $3, abc(%rip)
movl $.LC0, %edi
movl $0, %eax
call printf
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.comm abc,4,4
.ident "GCC: (GNU) 4.6.1 20110908 (Red Hat 4.6.1-9)"
.section .note.GNU-stack,"",@progbits
Điều gần nhất với tối ưu hóa thời gian chạy trong C là tối ưu hóa dựa trên profiler. Bạn biên dịch chương trình, sau đó chạy nó, trong khi sử dụng một trình thu thập thông tin để thu thập số liệu thống kê. Sau đó, bạn biên dịch lại, đưa ra các số liệu thống kê này cho trình biên dịch. Biên dịch thứ hai sẽ sử dụng thông tin này để tạo mã nhanh hơn. – ugoren