剖析我的一个C ++程序,我刚刚发现,在创build一堆文件时,调用std :: ofstream()比使用系统“touch”花费的时间less得多。
所以现在我想知道在Linux上std :: ofstream映射到哪个OS函数。
你知道什么std :: ofstream()调用来创build一个文件?
谢谢
如果你正在做system("touch filename");
这是误导和缓慢(和安全风险,和,…)。 它不会调用系统,而是产生一个shell,然后运行程序(在这种情况下触摸)。 打开一个流将使用某种实际的系统调用,可以直接访问文件系统。 在Linux上可能是http://linux.die.net/man/2/open 。 尝试在终端中运行strace touch
来查找正在进行的系统调用。 你可能也可以用你创建的简单的c ++程序来打开文件。 或者,如果您使用的是开源实现(gcc),则可以检查源代码。
你也应该考虑touch
的执行开销为二进制。 我相信性能的提高主要是由于测量流时在内存中有一个持久的二进制。
想想system()
。 它将fork / exec一个将从磁盘加载触摸二进制文件,共享库等的shell,执行它,清理进程并返回。
如果你只是使用touch来创建不存在的文件,那么它大部分等价于std :: ofstream.open(),它将执行一些函数调用并最终解析为系统调用open()
并最终close()
。 快很多 但是,如果你真的在模拟touch
的功能,那么它就更加复杂了。 EG如果文件已经存在,它只会改变时间戳等等,而且涉及更多。
不管你使用C ++编程的实际使用情况如何,都比通过system()
运行外部程序要快。