Tôi có một câu hỏi liên quan đến tốc độ dereferencing con trỏ. Tôi có cấu trúc như vậy:Tốc độ dereferencing C cấu trúc con trỏ
typedef struct _TD_RECT TD_RECT;
struct _TD_RECT {
double left;
double top;
double right;
double bottom;
};
Câu hỏi của tôi là, câu hỏi nào trong số này sẽ nhanh hơn và tại sao?
TRƯỜNG HỢP 1:
TD_RECT *pRect;
...
for(i = 0; i < m; i++)
{
if(p[i].x < pRect->left) ...
if(p[i].x > pRect->right) ...
if(p[i].y < pRect->top) ...
if(p[i].y > pRect->bottom) ...
}
TRƯỜNG HỢP 2:
TD_RECT *pRect;
double left = pRect->left;
double top = pRect->top;
double right = pRect->right;
double bottom = pRect->bottom;
...
for(i = 0; i < m; i++)
{
if(p[i].x < left) ...
if(p[i].x > right) ...
if(p[i].y < top) ...
if(p[i].y > bottom) ...
}
Vì vậy, trong trường hợp 1, vòng lặp được trực tiếp dereferencing con trỏ pRect để có được sự so sánh giá trị. Trong trường hợp 2, các giá trị mới được thực hiện trên không gian cục bộ của hàm (trên ngăn xếp) và các giá trị được sao chép từ pRect đến các biến cục bộ. Thông qua một vòng lặp sẽ có nhiều so sánh.
Trong tâm trí của tôi, họ sẽ không kém chậm, bởi vì các biến địa phương cũng là một tài liệu tham khảo bộ nhớ trên stack, nhưng tôi không chắc chắn ...
Ngoài ra, nó sẽ là tốt hơn để giữ tham khảo p [] theo chỉ mục, hoặc tăng p bởi một phần tử và dereference nó trực tiếp mà không có một chỉ mục.
Bất kỳ ý tưởng nào? Cảm ơn :)
Bỏ phí thời gian của bạn với tối ưu hóa sớm mà rất có thể sẽ không tạo ra một smidgen khác biệt. –
có lẽ là phần của một vấn đề về mùi, nhưng nếu có, tại sao không đo lường nó? – kenny
Đối với Win32, tôi có thể sử dụng GetTickCount() để đo thời gian trước và sau khi gọi vòng lặp để đo tốc độ, hoặc có cách nào tốt hơn không? – oldSkool