繁体   English   中英

C++ vs Python vs Ruby 在递归列出所有目录中的性能

[英]C++ vs Python vs Ruby Performance in Listing All Directories Recursively

我刚刚编写了一个 C++ 代码来递归列出文件夹中的所有目录。 我正在使用 Boost 文件系统,并且静态构建了以下代码:

#include <iostream>
#include <boost/filesystem.hpp>
using namespace boost::filesystem;
using namespace std;

int main(int argc, char* argv[]) {
    const path current_file_path(current_path());

    try {
        std::vector<path> directories_vector;
        for (auto&& x : recursive_directory_iterator(current_file_path))
            if (is_directory(x.path()))
                directories_vector.push_back(x.path());
        /* GETTING UP TO HERE TAKES MORE TIME THAN PYTHON OR RUBY*/

        for (auto&& x : directories_vector) {
            cout << x << '\n';
        }
    }
    catch (const filesystem_error& ex) {
        cout << ex.what() << '\n';
    }

    cin.get();
    return 0;
}

我想看看这段代码在 Python 和 Ruby 上的运行速度有多快。 我知道与 I/O 相关的东西不适合评估代码性能,但是当我运行 C++ 可执行文件时,15 个以上的递归文件夹需要将近 3 秒的时间,而以下 Python 和 Ruby 代码几乎立即运行:

红宝石:

Dir.glob("**/*/")

Python:

[x[0] for x in os.walk(directory)]

所有代码都在 SSD 上运行。 我在 Windows 上使用 Visual Studio 2017、Python 3.5.2 和 Ruby 2.4。 C++ 代码使用 Release/x64 模式,优化设置为最大优化(支持速度)(/O2)。

为什么 C++ 代码在面对大量递归文件夹时会变慢?

通过使用strace运行 C++ 版本和 Ruby 版本,我们可以得到一些线索,为什么 C++ 版本更慢。

使用Linux源代码进行测试(65000个文件):

strace -o '|wc' cpp_recursion
  86417  518501 9463879

strace -o '|wc' ruby -e 'Dir.glob("**/*")' 
  30563  180115 1827588

我们看到 C++ 版本执行的操作几乎是 Ruby 的 3 倍。

更仔细地查看 strace 输出,您会发现两个程序都使用getdents来检索目录条目,但 C++ 版本对每个文件都运行lstat ,而 Ruby 版本则不然。

我只能得出结论,C++ 版本的实现效率不如 Ruby 版本(或者它可能用于不同的目的)。 速度差异不是语言问题,而是实现问题。

NB 带-O优化的C++ 版本运行时间为0.347s,而Ruby 版本运行时间为0.304s。 至少在 Linux 上lstat似乎不会产生太多开销。 也许 Windows 上的情况有所不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM