我並不是想遏制你的熱情,但這已經是一個很好理解的問題。我會盡力解釋下面的內容。但是也許在另一個地區做你的項目會更好。如何「最大限度地提高MD5散列吞吐量」,那麼你就不會僅限於查看線程。
我認爲,當你編寫你的項目時,你需要提供一些分析,以瞭解何時並行處理合適,何時不合適。
每次你的CPU改變到另一個線程時,它必須保持當前的線程上下文並加載新的線程上下文。這種開銷在單線程進程中不會發生(除了像垃圾回收這樣的託管服務)。因此,所有其他方面相同,添加線程不會提高性能,因爲它必須執行原始工作負載加上所有上下文切換。
但是,如果您有多個CPU(核心)可供您使用,則爲每個CPU創建一個線程將意味着您可以並行計算而不會產生上下文切換成本。如果你有比CPU多的線程,那麼上下文切換將成爲一個問題。
有兩類計算:IO界限和計算界限。 IO綁定計算可能會花費大量的CPU週期等待某個硬件(如網卡或硬盤)的響應。由於這種開銷,可以將線程數增加到CPU再次被刷新的點,這可以抵消上下文切換的成本。但是線程的數量是有限制的,超過這個限制,上下文切換將花費比線程花費在IO上更多的時間。
計算約束計算只需要CPU時間進行數字運算。這是密碼破解者所使用的計算方式。計算綁定操作不會被阻塞,因此添加比CPU更多的線程會降低整體吞吐量。
C#ThreadPool已經爲您處理所有這些問題 - 您只需添加任務,並將它們排隊,直到線程可用。新線程僅在線程被阻塞時纔會創建。這樣,上下文切換就會最小化。
我有一個四核機 - 破題到4個線程,對自己的核心每個執行,會或多或少儘可能快地在我的機器可以蠻力密碼。
要認真並行處理這個問題,你需要大量的CPU。我讀過using the GPU of a graphics card來解決這個問題。
有一個攻擊媒介的分析,我寫了here如果它對你有任何用處。彩虹表和處理器/內存權衡將是另一個有趣的領域做的一個項目。
這些聽起來就像那些能夠很好地發現您的科學公平項目答案的問題。 –
@Greg爲了公平起見,他至少分析了問題的範圍是「我已經確定了要回答的問題」的程度,這很好。:-) – corsiKa