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

时间:2018-12-21 01:58:51

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

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

问题出在这里:

  

给出目录中的一堆文件,全部读取并计算单词数。创建一堆线程以并行读取文件。

NetApp(对存储非常了解的人)的共识是,使用更多线程可以使其速度更快。我认为在大多数情况下,您的I / O受到限制,以至于在1或2之后它会变慢。我只是不知道如何提高速度,除非您处于某些特殊情况下(例如SAN或RAID阵列)。即使在这些情况下,磁盘的顺序通道数也已饱和,并且仅在几个线程之后您又再次受到I / O约束。

我认为我的代码很棒(当然)。我已经写了C ++很多年了。我想我知道一些有关编写好的代码的知识。它应该只传递样式。呵呵。通常,性能优化不是您应该猜测的东西,应该对其进行测试和衡量。我只有有限的时间进行实验。但是现在我很好奇。

代码在我的GitHub帐户中:

https://github.com/MenaceSan/CountTextWords

有人对此有任何意见吗?阐明他们可能在想什么?还有其他对代码的批评吗?

我部分基于此:

Does multithreading make sense for IO-bound operations?

1 个答案:

答案 0 :(得分:0)

答案是,正如您所推测的那样,它很大程度上取决于任务的条件。而且,正如您所说,在实际测试之前,您是不会知道的。

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

您说:

  

NetApp(对存储非常了解的人)的共识是,使用更多线程,它应该变得更快。

他们是在面试中告诉您的吗?如果是这样,可能是因为这就是他们在硬件和软件堆栈方面的经验。如果是人力资源部的某人在面试后告诉您这一点,我可能会加些盐。试图将这种类型的信息传达给HR的工程师通常会以game of telephone的身份最终经过一位或多位经理,然后再与您交谈的人,他们对所讲内容的理解可能与您或工程师的理解不符。

在面试中有疑问时,请解释您的假设,并验证面试官是否同意这些假设;否则,请调整它们以符合他们的要求。他们可能会做出可笑的假设来了解您的想法,或者他们可能会遇到与您不同的经历。

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