为什么 gprof 告诉我一个只从 main() 调用一次的函数被调用了 102 次?

发布于 2024-08-31 14:54:58 字数 1691 浏览 5 评论 0 原文

我是一名初学者,为了好玩而编写了以下程序,用于搜索目录并将每个出现的单词替换为另一个单词。我调用了 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() );
}

I am a beginner, and wrote the following program for fun, to search through a directory and replace every occurrence of one word with another. I call the crt_ls_file() function once, and once only, but gprof tells me it is being called 102 times. I am wondering if anyone knows why this is. I have tried compiling the program will all and no optimizations.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

兰花执着 2024-09-07 14:54:59

在我的系统上,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

On my system gprof shows only one call to crt_ls_file as it should be:

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

So it seems you gprof is lying, which it sometimes does. If you really want to profile this program (there's little use), try callgrind and kcachegrind instead. They're much better and less arcane tools:

$ valgrind --tool=callgrind ./my_program some_dir
... let it do its job ...
$ kcachegrind
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文