2010-05-07 3 views
1

Je suis un débutant, et écrit le programme suivant pour le plaisir, pour rechercher dans un répertoire et remplacer chaque occurrence d'un mot par un autre. J'appelle une fois la fonction crt_ls_file(), et une seule fois, mais gprof me dit qu'elle est appelée 102 fois. Je me demande si quelqu'un sait pourquoi cela est. J'ai essayé de compiler le programme sera tout et pas d'optimisations.Pourquoi gprof me dit qu'une fonction appelée une seule fois par main() est appelée 102 fois?

#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()); 
} 

Répondre

1

Sur mon système gprof ne montre qu'un seul appel à crt_ls_file comme il devrait être:

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

Il vous semble gprof ment, ce qu'il fait parfois. Si vous voulez vraiment profiler ce programme (il y a peu d'utilité), essayez plutôt callgrind et kcachegrind. Ce sont des outils bien meilleurs et moins mystérieux:

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