У меня есть приложение, которое обычно сообщает ( time
команда сообщает):
real 1.59
user 1.42
sys 4.73
Но когда я загружаю общую библиотеку и запускаю ее, то время значительно увеличивается ( time
команда сообщает):
real 28.51
user 106.22
sys 5.23
Хотя определенный уровень увеличения производительности (в 2–4 раза, как и ожидалось, сообщается в CentOS и Ubuntu) можно ожидать из-за работы моей общей библиотеки, приведенные выше временные показатели для Fedora 24 слишком высоки.
Я попытался использовать perf
, что сообщило:
255352.948615 task-clock:u (msec) # 3.895 CPUs utilized
0 context-switches:u # 0.000 K/sec
0 cpu-migrations:u # 0.000 K/sec
18,127 page-faults:u # 0.071 K/sec
664,852,184,198 cycles:u # 2.604 GHz (50.03%)
19,323,811,463 stalled-cycles-frontend:u # 2.91% frontend cycles idle (50.02%)
578,178,881,331 stalled-cycles-backend:u # 86.96% backend cycles idle (50.02%)
110,595,196,687 instructions:u # 0.17 insn per cycle
# 5.23 stalled cycles per insn (50.00%)
28,361,633,658 branches:u # 111.068 M/sec (50.01%)
777,249,031 branch-misses:u # 2.74% of all branches (50.01%)
65.564158710 seconds time elapsed
Похоже, это говорит о том, что ЦП простаивает довольно долго. Но я пытаюсь найти, где это происходит в коде (у меня есть доступ ко всему исходному коду как моего приложения, так и разделяемой библиотеки, о которой идет речь). Я также видел, perf report
что which сообщает о времени, потраченном в процентах в функциях/системных вызовах. Но мне интересен еще более тонкий уровень, то есть какая строка(ы) в этих функциях, чтобы я мог понять, почему.
Я понимаю, что нелегко дать какой-либо конкретный совет, учитывая, что я не предоставил много информации о своем приложении/общей библиотеке. Я ищу только предложения/инструменты/идеи, чтобы выяснить, где процессор проводит большую часть своего времени в коде (или простаивает).
Это Fedora 24 Linux/x86_64 с glibc 2.23 (и мое приложение, и общая библиотека скомпилированы с помощью gcc 6.1.1 и glibc 2.23).
решение1
Похоже, это говорит о том, что процессор простаивает в течение длительного времени.
Да. А именно 87% всего времени. Но это не значит, что процессор не работает над другими задачами и процессами.
664,852,184,198 cycles:u # 2.604 GHz (50.03%)
19,323,811,463 stalled-cycles-frontend:u # 2.91% frontend cycles idle (50.02%)
578,178,881,331 stalled-cycles-backend:u # 86.96% backend cycles idle (50.02%)
110,595,196,687 instructions:u # 0.17 insn per cycle
Оптимизация программ для лучшего использования ресурсов ЦП и памяти — сложная задача, и без какого-либо кода невозможно дать вам более подробный ответ.