#c #templates #profiling #oprofile
#c #шаблоны #профилирование #oprofile
Вопрос:
В настоящее время я пытаюсь профилировать общую библиотеку. К сожалению, sprof, похоже, не работает в моей системе, поэтому я использую oprofile.
Однако, когда я исследую данные профилирования, указывается, что большая часть времени тратится на шаблонный метод. Этого следовало ожидать, поскольку большая часть вычислений чисел выполняется этим методом. Однако opreport указывает, что время тратится на определенную специализацию этого шаблона. Это может объяснить, почему вычисление кажется медленнее, чем должно быть. Некоторые из этих специализаций включают оптимизированный код, тогда как другие этого не делают, и opreport указывает, что время тратится на менее оптимизированную версию. Общий объект включает в себя экземпляры обеих версий, но я должен знать, правильно ли работает код, который решает, какая из них выбрана.
Я добавил некоторые cout
s к шаблонам, и они, похоже, указывают на то, что выбрана правильная специализация, но я все еще озадачен выводом opreport.
Редактировать:
Вот еще несколько подробностей о том, что я делаю. Код должен иметь возможность выполняться для ввода любой длины, но я могу оптимизировать его, если я знаю размер. Итак, я делаю что-то вроде этого:
template<size_t N>
struct simulator {
static void run(...) // optimized version for known N
};
template<>
struct simulator<0> {
static void run(...) // unoptimized version for any size
};
void simulate(....) {
switch(n) {
case(1):
simulator<1>::run(...);
break;
case(2):
simulator<2>::run(...);
break;
...
default:
simulator<0>::run(...);
}
}
В реальном коде я использую некоторую магию шаблона, чтобы разрешить максимальное число, для которого код оптимизирован как #define
, но идея та же. Теперь мне нужно убедиться, что simulator<0>::run()
действительно никогда не вызывается, когда этого не должно быть. Но opreport указывает, что выполняется только этот, но никакой другой ( cout
не согласен).
Комментарии:
1. «Общий объект включает в себя экземпляры обеих версий» — являются ли эти обе явные специализации одной и той же специализации параметров? Вы уверены, что не нарушаете ODR?
2. @dfri Параметры разные, поэтому я не нарушаю ODR. Я добавил некоторые подробности о том, что я пытаюсь сделать.
3. perf — это более новый инструмент профилирования, чем oprofile, вы также можете проверить это. Также вы можете попробовать запустить свое приложение в отладчике gdb и останавливать его в случайные моменты времени с помощью Ctrl-C и проверять обратную трассировку. У некоторых инструментов могут возникнуть проблемы с разборкой или поиском правильной отладочной информации для оптимизированного кода, и я ожидаю, что gdb и perf будут более продвинутыми в сложных ситуациях.