В последнем раунде рефакторинга моего кода я заменил кучу классов шаблонов с фиксированным числом аргументов шаблона с переменными аналогами. Я был немного озадачен, узнав, что в конкретном тесте производительности наблюдается снижение производительности около 20-30%.Эффективное влияние вариационных шаблонов
Несколько git bisect roundtrips позже опознавательный фиксатор был идентифицирован. Она в буквальном смысле состоит из одного изменения от
template <typename T, typename U>
class foo {};
в
template <typename T, typename ... Args>
class foo {};
Я экспериментально подтверждено, что применение этого одно изменение вызывает замедление упомянутого выше. Еще более озадачивающе, переключение версии компилятора (от GCC 4.7 до GCC 4.8) переносит замедление на другую аналогичную фиксацию (т. Е. Другой переход от фиксированного к вариационным аргументам, но в другом классе bar
).
Чтобы дать немного контекста, этот конкретный тестовый пример производительности представляет собой очень разреженную проблему компьютерной алгебры, которая связана с памятью и, следовательно, очень восприимчива к эффективному использованию кэш-памяти. Этот тестовый случай всегда был проблематичным местом в моем коде (например, вокруг GCC 4.4/4.5 я использовал, чтобы вручную настроить параметры компилятора, управляющие обнаружением размеров строки кэша, чтобы извлечь максимальную производительность).
Есть ли у кого-нибудь представление о том, что может вызвать такое поведение? К сожалению, я опасаюсь, что извлечение сокращенного тестового примера может быть очень сложным.
EDIT
Для справки, это обязательство, что восстановить хорошее поведение производительности. К сожалению, он состоит из возврата к невариантному коду для группы классов (а не только одного класса). Я попытаюсь придумать более ограниченный пример.
https://gitorious.org/piranhapp0x/mainline/commit/b952c613b42fe480fe4ed2dfd3e683eb9e38e4cd
Действительно ли это пустой класс? Или просто упрощение? –
@ DavidRodríguez-dribeas: просто упрощение. Я хотел бы пояснить, что единственным изменением был переход на объявление вариационного шаблона. Остальная часть кода остается неизменной и не знает разницы между вариабельными и невариантными версиями класса. – bluescarni
Если остальная часть кода осталась «неизменной», не будет ли это прерываться каждый раз, когда кто-то сказал 'U'? –