Hãy nói rằng tôi có metafunction sau:Tối ưu hóa hiệu suất thời gian biên dịch bởi bộ nhớ đệm metafunctions
template <typename T>
struct make_pair {
using type = std::pair<
typename std::remove_reference<T>::type,
typename std::remove_reference<T>::type
>;
};
Nó sẽ cải thiện tốc độ biên soạn để làm điều này (hay cái gì khác) để thay thế?
template <typename T>
struct make_pair {
using without_reference = typename std::remove_reference<T>::type;
using type = std::pair<without_reference, without_reference>;
};
tôi thấy hai khả năng:
Trình biên dịch đã làm một số công việc mỗi khi nó thấy
typename std::remove_reference<T>::type
. Sử dụng một bí danh trung gian có một số loại hành vi "bộ nhớ đệm", cho phép trình biên dịch thực hiện một số công việc chỉ một lần.Hiệu suất thời gian biên dịch được đo lường về số lượng bản mẫu tức thời mà trình biên dịch phải làm. Bởi vì
std::remove_reference<T>::type
đề cập đến cùng một loại nhưstd::remove_reference<T>::type
, chỉ có một bản mẫu được yêu cầu trong cả hai trường hợp, vì vậy cả hai triển khai đều tương đương với hiệu suất thời gian biên dịch WRT.
Tôi nghĩ B là đúng, nhưng tôi muốn chắc chắn. Nếu câu trả lời hóa ra là trình biên dịch cụ thể, tôi chủ yếu sẽ quan tâm đến việc biết câu trả lời cho Clang và GCC.
Sửa:
tôi làm chuẩn biên soạn của một chương trình thử nghiệm để có một số dữ liệu để làm việc với. Các chương trình thử nghiệm điều gì đó như thế:
template <typename ...> struct result;
template <typename T>
struct with_cache {
using without_reference = typename std::remove_reference<T>::type;
using type = result<without_reference, ..., without_reference>;
};
template <typename T>
struct without_cache {
using type = result<
typename std::remove_reference<T>::type,
...,
typename std::remove_reference<T>::type
>;
{ };
using Result = with[out]_cache<int>::type;
Đây là những lần trung bình cho 10 sưu tập của chương trình, với 10 000 thông số mẫu trong result<>
.
-------------------------
| g++ 4.8 | clang++ 3.2 |
-----------------------------------------
| with cache | 0.1628s | 0.3036s |
-----------------------------------------
| without cache | 0.1573s | 0.3785s |
-----------------------------------------
Chương trình thử nghiệm được tạo bởi tập lệnh có sẵn here.
Tôi nghĩ rằng không có số lượng đầu cơ có thể thay thế các phép đo thực tế. Xin vui lòng gửi một số số liệu thời gian sau đó chúng ta có thể tạo ra một lý thuyết tốt đẹp để giải thích chúng. –
Tôi đã thấy một cuộc trò chuyện trên tiếng kêu vang rằng họ tạo ra hashtables cho các bản mẫu ngay lập tức thay vì các danh sách được liên kết. Tôi không biết họ đang so sánh mình với ai. –
Trình biên dịch 'mẫu' không thực hiện việc ghi nhớ sẽ rất chậm. – Yakk