Powiedzmy mam następujący metafunkcji:Optymalizacja wydajności w czasie kompilacji przez buforowanie metafunkcji
template <typename T>
struct make_pair {
using type = std::pair<
typename std::remove_reference<T>::type,
typename std::remove_reference<T>::type
>;
};
Czy to poprawić szybkość kompilacji to zrobić (lub coś innego) w zamian?
template <typename T>
struct make_pair {
using without_reference = typename std::remove_reference<T>::type;
using type = std::pair<without_reference, without_reference>;
};
widzę dwie możliwości:
Kompilator musi popracować za każdym razem widzi
typename std::remove_reference<T>::type
. Używanie pośredniego aliasu ma pewien rodzaj zachowania "buforującego", które pozwala kompilatorowi wykonać tylko jedną pracę.Wydajność czasu kompilacji mierzona jest liczbą instancji szablonu, którą musi wykonać kompilator. Ponieważ
std::remove_reference<T>::type
odnosi się do tego samego typu costd::remove_reference<T>::type
, w obu przypadkach wymagana jest tylko jedna instancja szablonu, więc obie implementacje są równoważne wydajności w czasie kompilacji WRT.
Myślę, że B ma rację, ale chciałbym być pewien. Jeśli odpowiedź okaże się odpowiednia dla kompilatora, byłbym głównie zainteresowany poznaniem odpowiedzi na Clang i GCC.
Edit:
I porównywana kompilację programu testowego mieć pewne dane pracować. Program badań robi coś takiego:
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;
Oto średnie czasy dla 10 kompilacjach programu, z 10 000 parametrów szablonu w result<>
.
-------------------------
| g++ 4.8 | clang++ 3.2 |
-----------------------------------------
| with cache | 0.1628s | 0.3036s |
-----------------------------------------
| without cache | 0.1573s | 0.3785s |
-----------------------------------------
Program testowy jest generowany przez skrypt dostępny here.
Myślę, że żadne spekulacje nie zastąpią rzeczywistych pomiarów. Opublikujcie jakieś dane czasowe, a następnie możemy stworzyć ładną teorię, która je wyjaśni. –
Widziałem dyskusję na temat klangów, która mówi, że tworzą hashtables dla instancji szablonów zamiast połączonych list. Nie wiem jednak, do kogo się porównują. –
Kompilator 'szablonu', który nie dokonuje zapamiętywania, będzie śmiesznie wolny. – Yakk