分析我的一个C ++程序我刚刚发现在创建一堆文件时调用std :: ofstream()比使用系统“touch”花费的时间少得多。
所以现在我想知道在Linux上将std :: ofstream映射到哪个OS函数。
你知道std :: ofstream()调用什么来创建文件吗?
由于
答案 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()
运行外部程序更快。