C#代码在IIS上运行速度很快,但在Mono上运行缓慢 - 如何改进?

时间:2011-01-21 05:26:02

标签: c# asp.net performance mono mod-mono

我有一个在我的Windows开发机器上运行良好的ASP.NET应用程序。服务器是运行Mono的Linux,一旦上传,相同的代码运行速度比在Windows机器上慢4或5倍(例如,对于一个任务,需要25秒对5秒)。

这种性能是Mono的已知问题吗?我能做些什么吗?代码主要是文本处理,字符串替换,正则表达式等,如果这有任何区别。我在本地使用VS对我的代码进行了分析和调试,但我不知道是否可以在服务器上使用Mono进行远程调试,或者我接下来需要做什么才能解决它。

5 个答案:

答案 0 :(得分:6)

正则表达是Mono特别薄弱的领域。 Mono的Regex类总是使用解释代码,而.Net可以将其转换为编译的IL,从而加快执行速度。

大多数其他形式的文本处理(如替换)应大致相似。

答案 1 :(得分:4)

安装Mono,最好安装在与您的服务器类似的Linux系统上。在Mono上详细描述您的代码 ,看看瓶颈在哪里。

我在Linux服务器上运行一个遵循Apache日志文件的Mono应用程序。我是在Windows上开发的,当在Linux上进行测试时,我发现在Mono 2.4和.NET 3.5上它的速度要慢8到10倍。大部分时间都花在Regex.Match和字符串函数上。通过在4次调用string.EndsWith()中指定StringComparison.Ordinal,我能够在Mono中将程序的整体速度提高一倍。如果序数字符串比较是您想要的,那么可能会提高您的速度。

即使使用StringComparison.Ordinal,string.StartsWith()仍然很慢。通过编写我自己的string.StartsWith()版本,我的总体程序速度增加了25%。

因此,如果顺序比较是您的应用需要做的,请尝试指定StringComparison.Ordinal或编写自己的字符串函数。

答案 2 :(得分:1)

您使用的是StringBuilder对象,还是正在进行字符串连接。如果你正在做大量的字符串工作,你将遇到一些性能错误。

但是我觉得leppie有点头脑,微软花了很多钱测试并将ASP.net整合到IIS中,这样它真的非常非常快。如果您不想为MS盒付费,那么您将不得不处理Mono是开源的事实,而IIS是经过测试的商业产品。

这里有一个很好的例子,微软实际上使用与IIS服务器兼容的内核模式库修改了Windows本身。正确使用缓存构建的应用程序可以在此代码中获得非常好的性能提升:HTTP.sys

答案 3 :(得分:1)

您是否正在使用mod_mono或mod_proxy?虽然你可以从Mono中获得什么限制,但使用mod_mono比使用mod_proxy也会减少一般延迟。

请参阅Mono ASP.NET FAQ

上的“mod_mono和mod_proxy”部分

答案 4 :(得分:1)

According to this academic study,由于某些Linux系统“更快地转向硬盘缓存/交换空间”[与Windows相比],因此在一些Linux发行版中可能会妨碍单声道性能。

  

“请注意差异很大   在两个操作系统中指出   甚至使用本机代码。在131072   Fedora Core数组中的整数   4执行测试3操作系统   慢了3倍多   完全相同的Windows代码。“

由于Linux发行版内核调度配置各不相同,因此了解您在Linux服务器上运行的操作系统分发版和版本以及应用程序可用的内存和CPU周期数将很有用。

相关问题