2011-04-29 114 views
5

美好的一天傢伙如何在c#中優化或限制CPU使用率的壓縮過程(DotNetZip)?

我有一個應用程序,我用它來存檔一個文件夾使用DotNetZip庫。我注意到,當它進入實際的「壓縮」過程時,它佔用了100%的CPU。這個應用程序將與另一個應用程序(一個tcp聊天應用程序)結合使用,所以我真的需要使用盡可能少的cpu。

有什麼辦法可以安全地限制cpu嗎?我試着降低優先級,但它沒有什麼區別。我現在唯一的一件事情是將親和力設置爲1核心,以便它使用50%。但是,這當然只適用於多核計算機。

回答

3

降低優先級是你想要的,不一定強迫進程只使用任意數量的CPU,如50%。

這意味着該進程將盡可能多地使用未使用的 CPU的處理能力,並且您的其他更重要的進程仍然能夠運行,就好像Zip進程完全沒有運行一樣。

我應該認爲低優先級進程只使用100%的CPU,因爲沒有其他的東西。一旦你啓動並運行你的其他進程並再次嘗試,你會注意到Zip進程不會使用100%。

+1

您應該指出,這可以使用低優先級的線程完成;沒有必要爲像DotNetZip這樣的100%託管代碼庫啓動單獨的進程。 – 2011-04-29 03:21:59

1

通過降低優先級,你正在做你需要做的事情。如果適用,將親和力設置爲1也將有所幫助。

如果另一個進程需要CPU,您的進程將很樂意放在一邊,因此用戶不應該注意到放緩。除非你佔用CPU,否則使用100%的CPU沒有任何問題。理論上,您希望應用程序在需要時使用CPU,並在不使用時放棄它。

6

DotNetZip默認會在多個線程上運行,以CPU和內存利用率爲代價提供更快的壓縮。在多核系統上,如果有足夠的I/O吞吐量,這可以佔用所有CPU的100%。

如果你不想要這個,你可以將ZipFile.ParallelDeflateThreshold設置爲-1。這說「從不使用多個線程來壓縮」。這仍然會消耗單個線程可以獲得的所有cpu;在單核,單CPU的機器上,這仍然是100%。典型的當前問題筆記本電腦是雙核機器;它會在這種情況下顯示50%的CPU使用率,因爲一個內核將完全飽和。

如果您正在多核機器上運行,並且希望您的tcp通信應用程序繼續暢通無阻,那麼可以在後臺線程中啓動DotNetZip工作,並設置我上面提到的屬性。對於更多的隔離,你可以將DotNetZip分解爲一個單獨的進程,並在該進程上設置親和力+優先級,並設置parellel閾值屬性。

+0

這個屬性就像一個魅力!非常感謝@Cheeso – 2016-12-29 07:23:12