2011-03-07 56 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

相关问题