std :: ofstream和系统触摸

时间:2012-03-05 15:15:00

标签: c++ linux

分析我的一个C ++程序我刚刚发现在创建一堆文件时调用std :: ofstream()比使用系统“touch”花费的时间少得多。

所以现在我想知道在Linux上将std :: ofstream映射到哪个OS函数。

你知道std :: ofstream()调用什么来创建文件吗?

由于

3 个答案:

答案 0 :(得分:6)

如果您正在进行system("touch filename");,这会产生误导和缓慢(以及安全风险,并且......)。它不会像这样调用系统,而是生成一个shell,然后在其中运行程序(在这种情况下触摸)。 打开流将使用某种可以直接访问文件系统的实际系统调用。 Linux上可能是http://linux.die.net/man/2/open。 尝试在终端中运行strace touch以查找它正在进行的系统调用。你可以用一个简单的c ++程序做同样的事情,你只需要打开一个文件。或者,如果您使用的是开源实现(gcc),则可以检查源代码。

答案 1 :(得分:4)

您还应该将touch的执行开销视为二进制文件。我相信性能提升主要是由于在测量ofstream时内存中存在持久二进制文件。

答案 2 :(得分:1)

想想system()。它将fork / exec一个shell,它将从磁盘加载触摸二进制文件,共享库等,执行它,清理进程并返回。

如果您只是使用touch创建不存在的文件,那么它主要等同于std :: ofstream.open(),它将执行一些函数调用并最终解析为系统调用open()并最终close()。快得多。但是,如果您真的在模仿touch的功能,那么它会更复杂。例如。如果文件已经存在,它只会更改时间戳等,并且涉及更多。

无论您的实际使用情况如何,使用C ++进行编码都会比通过system()运行外部程序更快。