Пытаясь оптимизировать код, я немного озадачен различиями в профилях, созданных kcachegrdind
и gprof
. В частности, если я использую gprof (компиляция с переключателем -pg
и т. Д.), У меня будет следующее:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
89.62 3.71 3.71 204626 0.02 0.02 objR<true>::R_impl(std::vector<coords_t, std::allocator<coords_t> > const&, std::vector<unsigned long, std::allocator<unsigned long> > const&) const
5.56 3.94 0.23 18018180 0.00 0.00 W2(coords_t const&, coords_t const&)
3.87 4.10 0.16 200202 0.00 0.00 build_matrix(std::vector<coords_t, std::allocator<coords_t> > const&)
0.24 4.11 0.01 400406 0.00 0.00 std::vector<double, std::allocator<double> >::vector(std::vector<double, std::allocator<double> > const&)
0.24 4.12 0.01 100000 0.00 0.00 Wrat(std::vector<coords_t, std::allocator<coords_t> > const&, std::vector<coords_t, std::allocator<coords_t> > const&)
0.24 4.13 0.01 9 1.11 1.11 std::vector<short, std::allocator<short> >* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<std::vector<short, std::alloca
Что, кажется, предполагает, что мне не нужно искать никуда, кроме :: R_impl (. ..)
В то же время, если я скомпилирую без переключателя -pg
и запустил вместо него valgrind --tool = callgrind ./a.out
, у меня будет что-то довольно другое: вот скриншот вывода kcachegrind
Если я правильно интерпретирую, похоже, предполагается, что :: R_impl (...)
занимает около 50% времени , в то время как другая половина тратится на линейную алгебру ( Wrat (...)
, собственные значения
и лежащие в основе вызовы лапака), которая была намного ниже в gprof
] профиль.
Я понимаю, что gprof
и cachegrind
используют разные методы, и я бы не стал беспокоиться, если бы их результаты несколько отличались. Но здесь это выглядит совсем иначе, и я не понимаю, как это интерпретировать. Есть идеи или предложения?