Отладка медленных функций в программах на C (собранных gcc) - PullRequest
2 голосов
/ 20 октября 2010

Имея такой источник:

void foo() {
    func1();
    if(qqq) {
        func2();
    };
    func3();
    func4();
    for(...) {
        func5();
    }
}

Я хочу получить такую ​​информацию:

               void foo() {
5  ms; 2 times;    func1();
0  ms; 2 times;    if(qqq) {
0  ms; 0 times;        func2();
0  ms; 2 times;    };
20 ms; 2 times;    func3();
5  s ; 2 times;    func4();
0  ms; 60 times;   for(...) {
30 ms; 60 times;       func5();
0  ms; 60 times;   }
                }

Т.е. информация о том, сколько времени в среднем потребовалось для выполнения этой строки (реальные часы)время, включая ожидание в syscalls) и сколько раз он выполняется.

Какие инструменты мне следует использовать?

Я ожидаю, что инструмент будет инструментировать каждую функцию для измерения времени ее выполнения, которое используетсяс помощью инструментария внутри вызывающей функции, которая записывает файл журнала (или считает в памяти, а затем сбрасывает).

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

gprof довольно стандартен для программ, построенных на GNU (gcc, g ++): http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html

Вот как выглядит результат: http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html#SEC5

0 голосов
/ 21 октября 2010

Либо Zoom, либо Intel VTune.

0 голосов
/ 21 октября 2010

Пробный прогон Увеличение . Вы не будете разочарованы.

P.S. Не ожидайте, что инструменты сделают работу. Для информации либо на уровне линии, либо на уровне функции, стековый пробоотборник доставляет товары, предполагая, что вам абсолютно не нужны точные подсчеты вызовов (которые имеют мало отношения к производительности).


ДОБАВЛЕНО: Я в Windows, поэтому я просто запустил ваш код с LTProf . Вывод выглядит так:

  void foo(){
 5  func1();
    if(qqq){
 5    func2();
    }
 5  func3();
 5  func4();
    // I made this 16, not 60, so the total time would be 20 sec.
    for(int i = 0; i < 16; i++){
80    func5();
    } 
  }

, где каждый func() делает Sleep(1000), а qqq - True, поэтому все это работает в течение 20 секунд. Цифры слева - это процент выборок (6667 образцов), на которых есть эта линия. Так, например, один вызов одной из функций func использует 1 секунду или 5% от общего времени. Таким образом, вы можете видеть, что строка, где вызывается func5(), использует 80% общего времени. (То есть 16 из 20 секунд.) Все остальные строки были в стеке настолько малы, что их проценты равны нулю.

Я бы представил информацию по-другому, но это должно дать представление о том, что может сказать вам выборка из стека.

...