tháo rời, tháo rời, tháo rời ...
Tùy thuộc vào các dòng mã bạn không hiển thị chúng tôi có thể nếu con trỏ của bạn có phần tĩnh thì trình biên dịch tốt sẽ biết và tính toán địa chỉ cho cả hai. Nếu bạn không có tối ưu hóa thì toàn bộ cuộc thảo luận này bị tắt tiếng. Nó cũng phụ thuộc vào bộ xử lý bạn đang sử dụng, cả hai có thể được thực hiện với một lệnh duy nhất tùy thuộc vào bộ vi xử lý. Vì vậy, tôi làm theo các bước tối ưu hóa cơ bản:
1) tháo rời và kiểm tra 2) Thời gian thực hiện
Như đã đề cập ở trên dù mấu chốt là nó có thể là một trường hợp hai hướng dẫn thay vì một chi phí một đồng hồ đơn chu kỳ bạn sẽ không bao giờ thấy. Chất lượng của trình biên dịch và lựa chọn trình tối ưu hóa của bạn sẽ tạo ra sự khác biệt đáng kể về hiệu suất nhiều hơn là cố gắng tinh chỉnh một dòng mã với hy vọng cải thiện hiệu suất. Chuyển đổi trình biên dịch có thể cung cấp cho bạn 10-20% theo một trong hai hướng, đôi khi nhiều hơn. Như có thể thay đổi cờ tối ưu hóa của bạn, biến mọi thứ trên không làm cho mã nhanh nhất, đôi khi -O1 hoạt động tốt hơn -O3.
Hiểu được hai dòng mã đó tạo ra như thế nào và cách tối đa hóa hiệu suất từ ngôn ngữ cấp cao đến từ việc biên dịch cho các bộ xử lý và tháo khác nhau bằng cách sử dụng các trình biên dịch khác nhau. Và quan trọng hơn là mã xung quanh các dòng trong câu hỏi đóng một vai trò lớn trong cách trình biên dịch tối ưu hóa phân khúc đó.
Sử dụng ví dụ của người khác về vấn đề này:
typedef struct
{
unsigned int first;
unsigned int second;
} dataStruct;
dataStruct data;
int main()
{
dataStruct *pData = &data;
data.first = 9;
pData->second = 10;
return(0);
}
Với gcc (không phải là tuyệt vời một trình biên dịch) bạn nhận được:
mov r2, #10
mov r1, #9
stmia r3, {r1, r2}
Vì vậy, cả hai dòng mã C được gia nhập vào một cửa hàng, vấn đề ở đây là ví dụ được sử dụng như một bài kiểm tra. Hai hàm riêng biệt sẽ tốt hơn một chút nhưng nó cần nhiều mã hơn xung quanh nó và con trỏ cần trỏ vào một số bộ nhớ khác để trình tối ưu hóa không nhận ra đó là địa chỉ tĩnh toàn cục, để kiểm tra điều này bạn cần phải truyền địa chỉ do đó trình biên dịch (cũng gcc) không thể tìm ra rằng nó là một địa chỉ tĩnh.
Hoặc không có tối ưu hóa, cùng một mã, cùng một trình biên dịch, không có sự khác biệt giữa con trỏ và trực tiếp.
mov r3, #9
str r3, [r2, #0]
mov r3, #10
str r3, [r2, #4]
Đây là những gì bạn mong đợi sẽ thấy tùy thuộc vào trình biên dịch và bộ xử lý, có thể không có sự khác biệt. Đối với bộ xử lý này ngay cả khi mã kiểm tra ẩn địa chỉ tĩnh cho con trỏ từ hàm, nó vẫn sẽ đun sôi xuống hai hướng dẫn. Nếu giá trị được lưu trữ trong phần tử cấu trúc đã được tải trong một thanh ghi thì nó sẽ là một hướng dẫn một trong hai cách, con trỏ hoặc trực tiếp.
Vì vậy, câu trả lời cho câu hỏi của bạn không phải là tuyệt đối ...nó phụ thuộc. tháo rời và thử nghiệm.
Con trỏ cung cấp cho bạn quyền truy cập trực tiếp đó là gì? Và một con trỏ chậm hơn. –
-1 để hỏi về tối ưu hóa vi mô mà không cần điểm chuẩn trước. – bk1e