c++ - 如果我需要读取大量文件,将任务分成多个线程会更快吗?

标签 c++ multithreading performance filesystems c++17

我最近接受了 NetApp 的 C++ 职位面试(他们从事大数据存储系统)。我写了一些代码来回答面试问题。他们的回答是“你失败了”。很难获得反馈,因为通常是在面试失败后。经过一些非常有礼貌的请求反馈后,我得到了一点。但这仍然不太有意义。

问题是:

Given a bunch of files in a directory, read them all and count the words. Create a bunch of threads to read the files in parallel.

NetApp 的共识(对存储了解很多的人)是线程越多,速度越快。我认为在大多数情况下,你的 I/O 受限,在 1 或 2 之后它会变慢。我只是不知道如何才能变得更快,除非你在某些已知的特殊情况下(比如 SAN 或 RAID 阵列)即使在这些情况下,磁盘的顺序 channel 数量也会饱和,并且您仅在几个线程后就会再次受到 I/O 限制。

我认为我的代码很棒(当然)。我多年来一直在编写 C++。我想我知道一些关于什么是好的代码的事情。它应该单独传递风格。呵呵。作为一般规则,性能优化不是您应该猜测的,应该对其进行测试和测量。我只有有限的时间来进行实验。但现在我很好奇。

代码在我的 GitHub 帐户中:

https://github.com/MenaceSan/CountTextWords

有人对此有什么看法吗?阐明他们可能一直在想什么?对代码的任何其他批评?

我的部分观点基于此:

Does multithreading make sense for IO-bound operations?

最佳答案

答案是,正如您所猜测的,这在很大程度上取决于任务的条件。而且正如您所说,只有实际测试才能知道。

也就是说,这是对一家大数据存储提供商的采访。他们可能希望您假设该任务是在谈论您将为他们编写的系统(即大量非常快速的基于网络的存储),或者至少告诉他们您对该任务的假设是什么。此外,他们可能希望您讨论诸如文件大小和文件数量是否重要以及它们将如何影响事物之类的事情。 (以及所有其他因素——执行读取的计算机内存量、执行处理的 CPU 速度等)

你说:

The consensus at NetApp (people who know a lot about storage) is that it should get faster with more threads.

他们在面试时是否告诉过您?如果是这样,那可能是因为那是他们在硬件和软件堆栈方面的经验。如果是 HR 的人在面试后告诉你这个,我可能会持保留态度。试图将此类信息传达给 HR 的工程师通常以 game of telephone 告终。在与您交谈的人之前要经过一位或多位经理,他们对所说内容的理解可能与您或工程师的理解不一致。

如果在面试中有疑问,请解释您的假设,验证面试官是否同意这些假设,如果不同意,请调整它们以符合他们的要求。他们可能会做出荒谬的假设以了解您的想法,或者他们可能只是拥有与您不同的经历。

FWIW,听起来您对这项任务的挑战有一个合理的认识,至少对于像我这样的人每天使用的典型机器配置来说是这样。如果您解释那是您的假设,我就不会为此而责备您。但并不是每个面试的人都这么想。很抱歉你没有得到这份工作,但从它的声音来看,你很快就会找到一份工作!

关于c++ - 如果我需要读取大量文件,将任务分成多个线程会更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878291/

相关文章:

c++ - 使用LLVM检测C/C++代码

performance - 网站性能衡量

java - for 循环与 if-else 语句中的代码

python - 将大型 DataFrame 输出到 CSV 文件的最快方法是什么?

c++ - 在 C++ 中创建和传递多维数组的优雅方法?

c++ - 在几层继承上重载解析?

c++ - 通过函数越来越深入地传递指针

java - 只有 2 个线程用于调用生产和消费?

c++ - 为什么它不是线程安全的以及如何获得线程安全的?

multithreading - 多线程线程控制