Почему gprof сообщает мне, что функция, которая вызывается только один раз из main (), вызывается 102 раза? - PullRequest
1 голос
/ 07 мая 2010

Я новичок и написал забавную программу для поиска в каталоге и замены каждого вхождения одного слова другим. Я вызываю функцию crt_ls_file () один раз и только один раз, но gprof сообщает, что ее вызывают 102 раза. Мне интересно, если кто-нибудь знает, почему это так. Я попытался скомпилировать программу будет все и без оптимизации.

#include <iostream>
#include <string>
#include <cstdlib>
#include <cassert>
#include <fstream>
using namespace std;

void crt_ls_file(const string& output_f, const string& dir);
void sed(const string& old_string, const string& new_string, const string& filename, const string& directory);

int main(int argc, char* argv[]){

    string out_f;
    if  (argc <= 1) {
        cout << "Usage: " << argv[0] << " <Filename>" << endl;
        exit(EXIT_FAILURE);
    } else {
        out_f =  ".sandr";
        crt_ls_file(out_f, string(argv[1]) );
    }

    ifstream out_fs( out_f.c_str() );
    string line;
    getline(out_fs, line);
    while( !out_fs.eof() ){
        sed(string("index_SYMBOL"), string("index1_SYMBOL"), line, string(argv[1]) );
        getline(out_fs, line);
    }
    out_fs.close();
    string f( "rm " + out_f );
    system ( f.c_str() );

    exit(EXIT_SUCCESS);
}

void crt_ls_file(const string& s, const string& a){
    ofstream ls( s.c_str() );
    ls.close();
    string ls_output( "ls -1 " + a + " > ./" + string(s) );
    system( ls_output.c_str() );
}

void sed(const string& o, const string& n, const string& f, const string& d){
    ofstream dummy(".temp");
    dummy.close();

    string sed_output( "sed 's/" + o + "/" + n + "/g' " + d + "/" + f + " > .temp" );
    system( sed_output.c_str() );
    string rp( "mv .temp " + d + "/" + f );
    system ( rp.c_str() );
}

1 Ответ

1 голос
/ 07 мая 2010

В моей системе gprof показывает только один вызов crt_ls_file, как и должно быть:

  0.00      0.00     0.00        1     0.00     0.00  crt_ls_file(std::string const&, std::string const&)

Так что, кажется, вы gprof лжете, что иногда и делает. Если вы действительно хотите профилировать эту программу (там мало пользы), попробуйте вместо этого callgrind и kcachegrind. Они намного лучше и менее загадочные инструменты:

$ valgrind --tool=callgrind ./my_program some_dir
... let it do its job ...
$ kcachegrind
...