профилирование — _fu2___ZSt4cout занимает 21,49% времени выполнения в моем коде C ++

Я использую gprof для оптимизации своего кода на C ++ и получаю следующие результаты:

Flat profile:

Each sample counts as 0.01 seconds.
%    cumulative  self               self     total
time   seconds   seconds    calls    s/call   s/call  name
21.49      2.31     2.31                              _fu2___ZSt4cout
12.93      3.70     1.39   1560037     0.00     0.00  __gnu_cxx::new_allocator<DataINSPVAS>::construct(DataINSPVAS*, DataINSPVAS const&)
8.56      4.62     0.92  30267700     0.00     0.00  __gnu_cxx::new_allocator<AntennaData>::construct(AntennaData*, AntennaData const&)
6.14      5.28     0.66 261159927     0.00     0.00  __gnu_cxx::__normal_iterator<char*, std::string>::__normal_iterator(char* const&)
5.40      5.86     0.58 149234244     0.00     0.00  bool __gnu_cxx::operator!=<char*, std::string>(__gnu_cxx::__normal_iterator<char*, std::string> const&, __gnu_cxx::__normal_iterator<char*, std::string> const&) ...

Согласно этому плоскому профилю, функция FU2__ZSt4cout использует 21,49% времени работы. Кто-нибудь знает, что FU2__ZSt4cout обозначает?

0

Решение

(Быстрая точка: там как так много вопросов по ТАК так.)

Первый, gprof это «профилировщик процессора».
Это означает, что во время IO или любого другого системного вызова блокировки Заткнись.
Ваша программа может работать в течение 100 секунд, затрачивая 99 секунд на ввод-вывод, и gprof будет действовать так, как если бы он потратил всего 1 секунду.

Во-вторых, вы смотрите на время сам. Само время бесполезный, за исключением функций, которые много работают без вызова подфункций.
Так что если у вас есть целочисленный массив типа пузырьков, и вы тратите на него большую часть общего времени, gprof покажет это как узкое место.
Измените его на сортировку по строкам, где сравнение требует вызова функции, и gprof покажет большой% в strcmp, которая не там, где проблема вообще.

Судя по вашим выводам, я полагаю, что ваша программа в основном выполняет ввод-вывод, поэтому меня не удивляет, что из-за небольшого количества времени, которое она фактически выполняет, большая часть этого поступает в библиотечный ввод-вывод и выходит из него. подпрограммы.
Вы также показываете много времени в new и итератор.
Ничего удивительного.

Если вы ищете профилировщик, вам нужен тот, который производит выборку всего стека вызовов по времени настенных часов (не по времени ЦП) и сообщает процент времени, в течение которого каждая строка кода появляется в этих стеках.
Один такой профилировщик Увеличить.
(Кстати, не поддавайтесь на линию, которая вам нужна высокочастотные выборки, чтобы получить «точность».
Если вы получите 1000 образцов, этого будет более чем достаточно, чтобы увидеть, что занимает время.)

Когда я настраиваю производительность, я использую Этот метод.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]