2011-06-16 11 views
2

我贏了32個C++應用程序。我必須將330,000個對象加載到內存中。如果我使用順序方法,大約需要16分鐘。在線程方法中,我將10萬個容器中的330,000個對象等分。我創建了10個線程,併爲每個線程分配一個容量爲33000個對象的容器,以將它們加載到內存中。這種方法花了大約9分鐘。我的方法適用於線程池方法嗎?

增加線程沒有幫助的數量.....

我會得到任何進一步的改善,如果我使用線程池?

回答

3

一如既往沒有具體細節,這取決於。

你是從磁盤加載對象還是在內存中創建對象?如果你從磁盤加載它們,那麼它可能是IO的限制,所以增加線程的數量可能無濟於事。

在您提到的評論中,您是從數據庫加載的。我認爲當你使用線程同時進行N個查詢時,可能值得研究數據庫控制檯,以瞭解它如何應對許多併發查詢。另一方面,如果對象是由一些CPU綁定進程(例如計算pi)產生的,那麼機會會增加比CPU數量更多的線程數可能不會提高性能(並且作爲ronag在評論中指出,由於增加了context switching)可能會損害業績。

對象之間是否存在依賴關係?這將再次影響事態發展。

如果您希望以可配置的方式運行獨立任務,那麼您通常會使用線程池。這聽起來像使用線程池將是一個很好的方式來運行大量的基準與各種線程設置。您還可以設置可配置的線程數量,這有助於在不同的體系結構/系統上運行。

+0

是我加載從數據庫 – 2011-06-16 10:47:05

+2

對象我只是想補充一點,比CPU創造更多的線程不但不會提高性能,它甚至可能會降低性能。 – ronag 2011-06-16 11:09:01

+0

是查詢同時傳遞到數據庫e查詢將被罰款。那麼我是否達到了最佳性能? – 2011-06-16 11:15:04

0

輸入法,和你的,一些線程會加快這種任務。我猜測,由於更好地使用現代控制器上的'智能'磁盤緩存,整體吞吐量得到了改善 - 磁盤/控制器花費的時間更少,因爲總是有線程想要讀取某些內容。然而,只有少數幾個線程被加載並且你是磁盤綁定的,收益遞減會被設置。在一個稍微類似的應用程序中,我發現超過6個線程沒有提供額外的優勢&只是用盡了更多的內存。

我看不出池,否則,這些線程將會對性能有什麼區別 - 它只是有許多工作要做:(

告訴你的客戶,他們不得不安裝一個很大的工作SSD

RGDS, 馬丁

相關問題