Boost文件系统运行速度非常慢?

14

目前我正在学习Boost框架,我已经发现如何列出系统中的所有文件夹和文件,使用的是

#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#include <iostream>
using namespace std;
int main()
{
    for ( boost::filesystem::recursive_directory_iterator end, dir("C:\\");
       dir != end; ++dir ) {
       cout << *dir << std::endl;
    }
    return 0;
}

但我遇到的唯一问题就是这个过程非常缓慢...... 我做错了什么还是因为 Microsoft 的 .NET 版本列出所有文件要快得多?谢谢!


4
迭代器的默认构造函数会给出末尾迭代器。 - Borgleader
4
我在我的电脑上运行了代码,速度似乎还可以。你认为"慢"是指多慢?你有比较的基准吗? - Borgleader
16
尝试将 std::endl 替换为 \nstd::endl 会在每次输出操作时刷新缓冲区,这可能会导致速度变慢。 - Yuushi
3
您可能还想尝试这个链接:http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio,如果您不打算混合使用cout和printf的话。请参见此链接:https://dev59.com/_mox5IYBdhLWcg3wLhei。 - Borgleader
11
不要将基准测试与控制台IO搞混(因为控制台IO很慢)。如果您想比较boost::filesystem和.NET Directory的速度,请从C++和C#代码中移除所有控制台IO代码。然后您将得到更准确的结果。 - Chen
显示剩余7条评论
3个回答

1
你的问题涉及比较,但你只提供了一半信息,即你要进行比较的代码在哪里?有许多方法可以提高您提供的代码的性能,其中一些方法已在上面的评论中提供。
话虽如此,你观察到性能差异的原因很可能可以追溯到C#代码运行的受控环境。很可能你的文件系统在.NET的内存空间中被索引,而你的C++代码和Boost库直接访问文件系统,并没有从Microsoft试图使.NET环境更有效率的方式中获益。如果没有这些效率,似乎C#代码比同等质量的编译后的C++代码慢得多。

0

这也取决于文件夹中有多少文件。如果有很多文件,那么需要花费很长时间。您尝试过使用只包含很少文件的文件夹吗?


0

.NET版本可能已经被索引,也许只需要从平面格式中读取文件名。而你提出的方案需要打开每个单独的目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接