在Windows服务中托管的WCF服务运行速度比控制台应用程序慢10倍

Tod*_*ith 10 c# performance wcf windows-services

我有一个C#库,可以进行一些文件处理.我创建了一个控制台和桌面应用程序,它使用该库并在大约1分钟内处理256mb文件.然后我创建了一个托管在Windows服务中的WCF服务,该服务使用相同的文件处理库,但是当从网站调用时,处理相同的256mb文件需要花费10倍的时间.Windows服务在具有管理员权限的域帐户下运行.

调用WCF服务的开销非常快,但LoadFile方法需要更长的时间.我尝试在启动过程中增加进程优先级

Process.GetCurrentProcess ().PriorityClass = ProcessPriorityClass.High;
Run Code Online (Sandbox Code Playgroud)

无济于事.我在Win7 64位桌面系统(6gb),2003 XP 32位服务器(4gb)和2008 R2 32位服务器(4bg)上运行此服务都具有类似的结果.控制台和桌面应用程序在上述系统中大约1分钟处理文件.该过程似乎不受内存限制并进入swapville.

Windows服务是否以某种方式受到限制?在IIS下运行WCF服务会获得更好的结果吗?

编辑:我尝试从网站调用库目录,这也比控制台或桌面应用程序长10倍.

更新:原来是Log4PostSharp.控制台和桌面应用程序在配置文件中没有任何log4net痕迹,但网站和Windows服务却没有.有一个log4net TraceAppender静静地占用了宝贵的CPU周期.

adr*_*nks 4

我不明白为什么你所描述的行为会发生——它看起来确实很奇怪。由于您正在处理内存中相对较大的文件,因此垃圾收集器可能会影响它。您可以尝试更改垃圾收集器运行的模式,看看是否有效果。

垃圾收集器具有三种模式——工作站、服务器和并发。每一种都有不同的行为方式,并针对不同类型的应用程序进行了优化。工作站模式是默认模式,并且是所有进程运行时使用的模式,除非配置为使用其他模式。有关模式的更多信息可以在此处找到。

尝试显式设置垃圾收集器以使用服务器模式(但它仅对多处理器计算机有效)。为此,请将以下内容放入您的app.config文件中:

<configuration>
    <runtime>
        <gcServer enabled="true" />
    </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

  • 我不会对你投反对票,但由于 GC 导致 10 倍的减速似乎有些牵强。还有其他领域需要首先调查,特别是考虑到我们从 OP 获得的信息非常少。 (2认同)