2011-03-07 81 views
10

我有一個C#庫,可以進行一些文件處理。我創建了一個使用該庫的控制檯和桌面應用程序,並在大約1分鐘內處理一個256MB文件。然後,我創建了一個WCF服務,該服務託管在Windows服務中,該服務使用相同的文件處理庫,但在從網站調用時處理相同的256mb文件需要10倍的時間。 Windows服務在具有管理員權限的域帳戶下運行。WCF服務託管在Windows服務運行10倍慢於控制檯應用程序

調用WCF服務的開銷非常快,但LoadFile方法需要更長的時間。我試圖通過

Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; 

無效,增加了啓動過程中的進程優先級。我已經在Win7 64位桌面系統(6GB),2003 XP 32位服務器(4GB)和2008 R2 32位服務器(4bg)上運行這項服務,所有這些服務都有類似的結果。控制檯和桌面應用程序各自在上述系統中大約1分鐘處理文件。這個過程似乎沒有受到內存限制並進入swapville。

是否Windows服務以某種方式進程受到限制?我會在IIS下運行WCF服務獲得更好的結果嗎?

編輯:我試着從網站調用庫目錄,這也比控制檯或桌面應用程序長10倍。

UPDATE:原來是Log4PostSharp。控制檯和桌面應用程序在配置文件中沒有任何log4net的痕跡,但網站和Windows服務沒有。有一個log4net TraceAppender默默地佔用了寶貴的CPU週期。

+2

您是如何精確加載文件的?您是否嘗試使用分析器來查看瓶頸的確切位置(VS 2010 Ultimate包含分析器) – 2011-03-07 22:22:54

+6

如果您還沒有這樣做,我建議將進程優先級恢復到正常狀態。修改流程優先級通常不會加速程序,並且可能會產生其他問題。 – 2011-03-07 22:23:52

+0

@Davide:分析器也在Premium中。 +1;這是要走的路。 – 2011-03-07 22:29:27

回答

4

我想不出爲什麼你描述的行爲正在發生 - 它確實看起來很奇怪。由於您正在處理內存中相對較大的文件,垃圾收集器可能正在影響它。您可以嘗試更改垃圾收集器運行的模式以查看它是否有任何影響。

垃圾收集器有三種模式 - 工作站,服務器和併發。每個人都以不同的方式行事,並針對不同類型的應用程序進行了優化。工作站模式是默認模式,並且除非配置爲使用其他內容,否則所有進程都將使用該模式。有關模式的更多信息可以在here找到。

嘗試顯式設置垃圾收集器以使用服務器模式(它只會對多處理器計算機產生影響)。爲此,請將app.config文件中的以下內容寫入:

<configuration> 
    <runtime> 
     <gcServer enabled="true" /> 
    </runtime> 
</configuration> 
+0

到目前爲止沒有這個變化的運氣 – 2011-03-08 00:28:11

+2

我不會低估你,但由於GC的10倍放緩似乎很牽強。還有其他領域需要首先進行調查,特別是考慮到我們從OP得到的信息非常少。 – 2011-03-08 06:31:35

+0

@Johann:由於垃圾收集器在收集垃圾時,我經歷了大量的緩慢下降 - 請看看正在運行的應用程序中正在努力工作的'%time in GC'性能計數器。 – adrianbanks 2011-03-08 09:51:04

相關問題