Как профилировать C++ в моей собственной общей библиотеке

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

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 в выводе.

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

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

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, кривая будет уже.

Другие вопросы по тегам