Как профилировать С++ мою собственную общую библиотеку

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

int main() {
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    MatrixXd frames = creatMatriXdromVtdFile("/home/michael/Dropbox/Java_Workspace/test/frame.vtd");
//  MatrixXd frame = frames.row(0).array();
    auto start = std::chrono::system_clock::now();
    MatrixXd m = demodulateMatrix(frames.data(), frames.rows(), frames.cols());
    auto end = std::chrono::system_clock::now();
    auto elapsed =
        std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

    cout << "Demodulated all data in ";
    cout << elapsed;
    cout << " us \n";
    cout << m.row(1);
    return 0;
}

По сути, это второй проект. После профилирования с помощью gprof я даже не вижу функцию demodulateMatrix на выходе.

введите здесь описание изображения

Как я могу получить информацию о том, что происходит внутри разделяемой библиотеки (как распределяется память, какие функции занимают какое время и т.д.)?


person user1685095    schedule 21.05.2014    source источник
comment
Вы собрали библиотеку с включенным профилированием? С отладочной информацией (хотя я не уверен, что она нужна для профилирования)?   -  person Some programmer dude    schedule 21.05.2014
comment
Ну, я пробовал это.   -  person user1685095    schedule 21.05.2014
comment
Мне кажется, что это длится слишком короткий период времени. Вам нужно запустить что-то более тяжелое в вашем тестовом примере.   -  person Mats Petersson    schedule 21.05.2014
comment
Ну, время демодуляции около 500 миллисекунд. Например, для создания матрицы требуется более 80 мс. Но я вижу на выходе createMatrix, но не функцию демодуляции...   -  person user1685095    schedule 21.05.2014
comment
Это gprof. Он говорит вам собственное время, и это бесполезно. См. этот ответ. Общие комментарии относятся к вашей ситуации. (Если программа работает слишком быстро для сэмплирования, зациклите ее.)   -  person Mike Dunlavey    schedule 21.05.2014


Ответы (1)


gprof — уважаемый и новаторский инструмент.

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

Узнать, что стоит время в вашей программе, на самом деле довольно просто. Я и другие используют этот метод.

Дело в том, что во время выполнения программы существует стек вызовов, состоящий из текущего счетчика программ, а также обратного адреса для каждой инструкции вызова функции, которая в данный момент находится в процессе выполнения в потоке.

Если вы можете сделать рентгеновский снимок стека вызовов в произвольный момент времени и изучить все его уровни в контексте отладчика, вы сможете точно сказать, что он пытался сделать и почему в этот момент времени. время.

Если он тратит 30% своего времени на то, о чем вы никогда не догадывались, но что вам на самом деле не нужно, вы обнаружите его в 3 из 10 образцов стека, более или менее, и этого достаточно, чтобы найти его. Вы не будете точно знать, каков процент, но вы будете точно знать, в чем проблема.

Время, которое стоит любая инструкция (время, которое вы бы сэкономили, если бы избавились от нее) — это просто процент времени, в течение которого она находится в стеке, будь то инструкция без вызова или инструкция вызова. Если это стоит достаточно времени, чтобы его можно было исправить, оно проявится в умеренном количестве образцов.

ДОБАВЛЕНО: Не буду заморачиваться, но всегда найдется кто-то, кто скажет: «Слишком мало сэмплов, он найдет не тот материал!» Ладно. Предположим, вы берете десять случайных выборок из стека и видите что-то, от чего можно избавиться в трех из них. Сколько это стоит? Ну ты точно не знаешь. Он имеет распределение вероятностей, которое выглядит точно так:

введите здесь описание изображения

Вы можете видеть, что наиболее вероятная стоимость составляет 30% (неудивительно) для ускорения 10/7 = 1,4x, но она будет больше или меньше. Насколько больше или меньше? Что ж, чистое пространство между двумя заштрихованными областями соответствует 95% вероятности. Другими словами, да есть шанс, что стоимость будет меньше 10%, а именно около 2,5%. Если стоимость составляет 10%, ускорение составляет 10/9 = 1,1x. С другой стороны, существует равная вероятность того, что стоимость выше 60% для ускорения 10/4 = 2,5x.

Таким образом, расчетное ускорение равно 1,4, но хотя оно может быть и 1,1, не стоит сбрасывать со счетов равную вероятность того, что оно может достигать 2,5. Конечно, если взять 20 проб вместо 10, кривая будет уже.

person Mike Dunlavey    schedule 22.05.2014