【发布时间】:2023-03-24 08:29:01
【问题描述】:
我最近接受了 NetApp 的 C++ 职位面试(他们负责大数据存储系统)。我写了一些代码来回答一个面试问题。他们的回答是“你失败了”。很难获得反馈,因为通常是在面试失败后。经过一些非常有礼貌的乞求反馈后,我得到了一些反馈。但这仍然不是很有意义。
问题来了:
给定一个目录中的一堆文件,将它们全部读取并计算单词。创建一堆线程来并行读取文件。
NetApp(对存储有很多了解的人)的共识是,它应该通过更多线程变得更快。我认为在大多数情况下,您的 I/O 限制如此之大,以至于在 1 或 2 之后它会变慢。我只是不明白如何才能变得更快,除非您在某些已知的特殊情况下(例如 SAN 或 RAID 阵列)即使在这些情况下,磁盘的顺序通道数也会饱和,并且您在几个线程之后再次受到 I/O 限制。
我认为我的代码很棒(当然)。我已经写 C++ 很多年了。我想我知道什么是好的代码。它应该只传递风格。呵呵。作为一般规则,性能优化不是你应该猜测的,它们应该被测试和测量。我只有有限的时间进行实验。但现在我很好奇。
代码在我的 GitHub 帐户中:
https://github.com/MenaceSan/CountTextWords
有人对此有意见吗?阐明他们可能一直在想什么?对代码的任何其他批评?
我的部分观点基于此:
【问题讨论】:
-
有时候你真的比面试你的人更聪明。我同意您的评估,即这是 I/O 受限情况。几个线程可能会带来一点额外的性能,但我不会费心去超越。
-
它是 IO 绑定的,但是在线程读取内存中的一个块(解析文本)之后,您也会在线程中做一些实际工作。因此,您可以在那里获得一些性能提升。此外,您可以将文件缓存在内存中。在这种情况下,您将获得更好的利用率。还取决于底层的 fs 和设备。所以,在那里使用几个线程是有意义的。
-
是的,所以 2 个线程可能会获得一些好处。 CPU 工作可以在一个线程上完成,而另一个线程处于 i/o 等待模式。 i/o 绑定方面似乎总是比工作的 cpu 部分花费更长的时间。因此,超过 2 个线程似乎又回到了线程被浪费的同一个问题。但没有什么是100%的。在正确的硬件上,它实际上可能会从更多的线程中受益。我想他们不想让我写一个自我平衡的程序。面试?真的吗 ?呵呵。我想要干净的代码。
标签: c++ multithreading performance filesystems c++17