我并不是要抑制你的热情,但这已经是一个很好理解的问题。我将尝试解释下面会发生什么。但也许在另一个领域做你的项目会更好。“最大化 MD5 散列吞吐量”怎么样,那么您就不会仅限于查看线程。
我认为,当您编写项目时,您需要提供某种分析,以确定何时适合并行处理,何时不适合。
每次您的 CPU 更改为另一个线程时,它都必须保留当前线程上下文并加载新的线程上下文。这种开销不会发生在单线程进程中(垃圾收集等托管服务除外)。因此,在其他条件相同的情况下,添加线程不会提高性能,因为它必须完成原始工作负载以及所有上下文切换。
但是,如果您有多个 CPU(内核)可供使用,则为每个 CPU 创建一个线程意味着您可以并行计算而不会产生上下文切换成本。如果你有比 CPU 更多的线程,那么上下文切换将成为一个问题。
有 2 类计算:IO-bound 和 compute-bound。IO 密集型计算可能会花费大量 CPU 周期来等待来自某些硬件(如网卡或硬盘)的响应。由于这种开销,您可以将线程数增加到 CPU 再次达到极限的程度,这可以抵消上下文切换的成本。然而,线程数量是有限制的,超过这个限制,上下文切换将花费比线程阻塞 IO 更多的时间。
计算密集型计算只需要 CPU 时间来处理数字。这是密码破解者使用的计算类型。计算绑定操作不会被阻塞,因此添加比 CPU 更多的线程会降低整体吞吐量。
C# ThreadPool已经为您处理了所有这些 - 您只需添加任务,并将它们排队,直到线程可用。新线程仅在线程被阻塞时创建。这样,上下文切换被最小化。
我有一台四核机器 - 将问题分解为 4 个线程,每个线程在自己的核心上执行,或多或少与我的机器可以暴力破解密码一样快。
要认真并行化这个问题,您将需要大量 CPU。我读过关于使用显卡的 GPU来解决这个问题的文章。
如果对您有用的话,我在这里写了一个攻击向量分析。彩虹表和处理器/内存权衡将是另一个有趣的项目领域。