Một số người nói: "Bất kỳ hoạt động nào có thể đạt được bằng cách lập chỉ mục mảng cũng có thể được thực hiện với con trỏ. Phiên bản con trỏ nói chung sẽ nhanh hơn".Hiệu quả giữa con trỏ và mảng (hướng dẫn lắp ráp ít hơn không mất ít thời gian hơn)
tôi nghi ngờ về kết quả trên, vì vậy tôi làm bài kiểm tra sau:
Trong bài viết sau, chúng tôi không quan tâm biên dịch tối ưu hóa. Về biên dịch tối ưu hóa như thế nào làm ảnh hưởng đến hiệu quả giữa con trỏ và mảng, xin lưu ý: Efficiency: arrays vs pointers
(Visual Studio 2010, Debug Mode, không tối ưu)
#include <windows.h>
#include <stdio.h>
int main()
{
int a[] = {10,20,30};
int* ap = a;
long counter;
int start_time, end_time;
int index;
start_time = GetTickCount();
for (counter = 1000000000L; counter>0; counter--)
{
*(ap+1) = 100;
}
end_time = GetTickCount();
printf("10 billion times of *ap = %d\n", end_time-start_time);
start_time = GetTickCount();
for (counter = 1000000000L; counter>0; counter--)
{
a[1] = 101;
}
end_time = GetTickCount();
printf("10 billion times of a[0] = %d\n", end_time-start_time);
return 0;
}
kết quả là:
10 billion times of *ap = 3276
10 billion times of a[0] = 3541
Con trỏ có vẻ hơi nhanh. Nhưng sau khi tôi đã so sánh dis-lắp ráp, tôi rơi vào một sự nhầm lẫn sâu hơn.
(Visual Studio 2010, Debug Mode, không tối ưu)
; 17 : *(ap+1) = 100;
mov eax, DWORD PTR _ap$[ebp]
mov DWORD PTR [eax+4], 100 ; 00000064H
; 25 : a[1] = 101;
mov DWORD PTR _a$[ebp+4], 101 ; 00000065H
Từ lắp ráp đầu ra, truy cập bộ nhớ thông qua một con trỏ mất 2 hướng dẫn và mảng chỉ mất 1 lệnh.
Tại sao mảng thực thi ít hướng dẫn hơn nhưng không mất nhiều thời gian hơn con trỏ?
Có liên quan đến bộ nhớ cache cpu không? Làm cách nào tôi có thể sửa đổi mã thử nghiệm của mình để chứng minh?
không bao giờ tối ưu hóa ở chế độ Gỡ lỗi ... – TemplateRex
Nhiều năm trước, tôi đã thử nghiệm chính xác điều này. Phiên bản lập chỉ mục mảng nhanh hơn. Tuyên bố là rác, hoặc có thể nhanh hơn, nó chỉ phụ thuộc. – john
Nó chỉ phụ thuộc ... vào phần cứng? – Philip