Tôi đang cố gắng so sánh hiệu suất giữa các con trỏ thô, tăng shared_ptr và tăng weak_ptr. Trên phần dereferencing, tôi dự kiến shared_ptr và raw_ptr là bằng nhau, nhưng kết quả cho thấy shared_ptr là khoảng hai lần như chậm. Đối với các bài kiểm tra, tôi đang tạo ra một mảng với một trong hai con trỏ hoặc gợi ý chia sẻ để ints, và sau đó dereferencing trong một vòng lặp như thế này:Boost shared_ptr dereference cost
int result;
for(int i = 0; i != 100; ++i)
{
for(int i = 0; i != SIZE; ++i)
result += *array[i];
}
Mã đầy đủ cho các thử nghiệm có thể được tìm thấy ở đây: https://github.com/coolfluid/coolfluid3/blob/master/test/common/utest-ptr-benchmark.cpp
timings thử nghiệm cho một build tối ưu mà không khẳng định có thể được tìm thấy ở đây: http://coolfluidsrv.vki.ac.be/cdash/testDetails.php?test=145592&build=7777
các giá trị quan tâm là "thời gian DerefShared" và "thời gian DerefRaw"
Tôi đoán thử nghiệm có thể bị thiếu sót bằng cách nào đó, nhưng tôi đã thất bại trong việc tìm ra sự khác biệt đến từ đâu. Profiling hiển thị toán tử * từ shared_ptr được inlined, nó dường như mất nhiều thời gian hơn. Tôi kiểm tra lại rằng khẳng định tăng đã tắt.
Tôi sẽ rất biết ơn nếu có ai có thể giải thích sự khác biệt có thể đến từ đâu.
bổ sung độc lập kiểm tra: https://gist.github.com/1335014
+1, tôi đã suy nghĩ về việc này một ngày khác nữa. –
Hiệu ứng bộ nhớ cache? shared_ptr lớn hơn con trỏ thô, vì vậy mảng của bạn sẽ bao gồm nhiều dòng bộ nhớ cache hơn và mất nhiều thời gian hơn để đọc. –
Bạn đang chạy các thử nghiệm này trên nền tảng nào? – SoapBox