Я использую 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 обозначает?
(Быстрая точка: там как так много вопросов по ТАК так.)
Первый, gprof
это «профилировщик процессора».
Это означает, что во время IO или любого другого системного вызова блокировки Заткнись.
Ваша программа может работать в течение 100 секунд, затрачивая 99 секунд на ввод-вывод, и gprof
будет действовать так, как если бы он потратил всего 1 секунду.
Во-вторых, вы смотрите на время сам. Само время бесполезный, за исключением функций, которые много работают без вызова подфункций.
Так что если у вас есть целочисленный массив типа пузырьков, и вы тратите на него большую часть общего времени, gprof
покажет это как узкое место.
Измените его на сортировку по строкам, где сравнение требует вызова функции, и gprof
покажет большой% в strcmp
, которая не там, где проблема вообще.
Судя по вашим выводам, я полагаю, что ваша программа в основном выполняет ввод-вывод, поэтому меня не удивляет, что из-за небольшого количества времени, которое она фактически выполняет, большая часть этого поступает в библиотечный ввод-вывод и выходит из него. подпрограммы.
Вы также показываете много времени в new
и итератор.
Ничего удивительного.
Если вы ищете профилировщик, вам нужен тот, который производит выборку всего стека вызовов по времени настенных часов (не по времени ЦП) и сообщает процент времени, в течение которого каждая строка кода появляется в этих стеках.
Один такой профилировщик Увеличить.
(Кстати, не поддавайтесь на линию, которая вам нужна высокочастотные выборки, чтобы получить «точность».
Если вы получите 1000 образцов, этого будет более чем достаточно, чтобы увидеть, что занимает время.)
Когда я настраиваю производительность, я использую Этот метод.
Других решений пока нет …