Xét các chương trình thử nghiệm sau đây:Tại sao dereferencing làm cho chương trình của tôi nhanh hơn?
int main(void) {
int iterations = 1000000000;
while (iterations > 0)
-- iterations;
}
Loop value on the stack (dereferenced)
int main(void) {
int iterations = 1000000000;
int * p = & iterations;
while (* p > 0)
-- * p;
}
#include <stdlib.h>
int main(void) {
int * p = malloc(sizeof(int));
* p = 1000000000;
while (*p > 0)
-- * p;
}
Bằng biên soạn chúng với -O0, tôi nhận được t anh sau thời gian thực hiện:
case1.c
real 0m2.698s
user 0m2.690s
sys 0m0.003s
case2.c
real 0m2.574s
user 0m2.567s
sys 0m0.000s
case3.c
real 0m2.566s
user 0m2.560s
sys 0m0.000s
[sửa] Sau đây là mức trung bình trên 10 hành:
case1.c
2.70364
case2.c
2.57091
case3.c
2.57000
Tại sao thời gian thực hiện lớn hơn với các trường hợp thử nghiệm đầu tiên, mà có vẻ là đơn giản nhất?
Kiến trúc hiện tại của tôi là máy ảo x86 (Archlinux). Tôi nhận được những kết quả này cả với gcc (4.8.0) và clang (3.3).
[sửa 1] Mã lắp ráp được tạo gần như giống hệt nhau ngoại trừ mã thứ hai và thứ ba có nhiều hướng dẫn hơn mã đầu tiên.
[sửa 2] Những màn trình diễn này có thể tái sản xuất (trên hệ thống của tôi). Mỗi lần thực hiện sẽ có cùng thứ tự độ lớn.
[sửa] Tôi không thực sự quan tâm đến màn trình diễn của một chương trình không được tối ưu hóa, nhưng tôi không hiểu tại sao nó lại chậm hơn và tôi tò mò.
Bạn đã thử xem mã được tạo chưa? Tại sao bạn quan tâm đến hiệu suất của mã chưa được tối ưu hóa? –
Hae bạn đã thử chạy chúng theo một thứ tự khác? Có phải những lần phát một lần này, hay trung bình trên một số lượng đáng kể các lần chạy? – EJP
@CarlNorum Hầu như cùng một mã được tạo, ngoại trừ việc có thêm hướng dẫn (di chuyển và tải) trong hai ví dụ cuối cùng. Tôi không quan tâm đến màn trình diễn, nhưng tôi vẫn tò mò :) –