为什么std :: ofstream :: open在visual c ++ 2013中很慢?

时间:2018-04-30 15:29:27

标签: c++ winapi visual-c++ ofstream

我的应用程序是典型的服务器/客户端应用程序。客户端使用visual c ++ 2013(Windows 10)编译,服务器使用g ++(Linux)编译。

服务器发送文件,客户端接收这些文件并将其写入磁盘。 客户端获取多个线程上的网络数据(文件),这些线程将数据写入临时文件。如果已经完全接收到文件,则将其移动到正确的位置。

在其中一个测试用例中,服务器向客户端发送了50万个文件。获取文件并将其写入磁盘几乎需要一个小时。同样的测试用例在半小时内在linux客户端上完成。

我使用“Very Sleepy CS”对Windows客户端进行了分析,并且配置文件结果显示std :: ofstream :: open(CreateFile)整体需要半小时。 ofstram :: write和ofstream :: close花了不到10分钟。

我想知道为什么ofstream :: open会花很多时间在Windows上?

无论如何我可以加速std :: ofstream :: open吗?

可以归功于硬盘吗?我在这个测试用例中使用SSHD。但如果HDD是一个问题,那么它也会影响std :: ofstream :: write。

我禁用了防病毒软件,以排除防病毒软件的任何干扰。

这是callstack

Very Sleepy CS callstack showing time spent

1 个答案:

答案 0 :(得分:0)

如果要将500k临时文件保存到单个文件夹中,则可能因为NTFS开销而导致CreateFile变慢。 Windows不喜欢单个目录中的那么多目录条目。它有效,但可能很慢。

您可以使用额外级别的子目录来减少开销。例如。计算文件名的哈希值,获取哈希值的最低10位,将数字打印到字符串,然后将文件放入具有该名称的子目录中。或者只使用随机数。这样,您的文件将有1024个子目录,每个子目录包含更多可管理的临时文件。

一些访问大量文件的程序使用类似的东西,例如: squid代理缓存/ var / spool / squid中多个子文件夹中的内容。