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

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

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

对于Mono来说,正则表达式是一个特别薄弱的领域。 Mono的Regex类总是使用解释代码,而.Net可以将其转换为编译的IL,从而实现更快的执行速度。

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

安装Mono,最好安装在与您的服务器类似的Linux系统上。 在Mono上描述您的代码并查看瓶颈所在。

我有一个在Linux服务器上运行的Mono应用程序,它遵循Apache日志文件。 我是在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或编写自己的字符串函数。

你使用mod_mono或mod_proxy吗? 虽然你可以从Mono中得到什么限制,但使用mod_mono比使用mod_proxy也会减少一般延迟。

请参阅Mono ASP.NET FAQ中的 “mod_mono和mod_proxy”部分

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

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

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

根据这项学术研究 ,由于某些Linux系统“更快地转向硬盘缓存/交换空间”[与Windows相比],Mono性能在一些Linux发行版中可能受到阻碍。

“请注意两个操作系统中显示的巨大差异,即使使用本机代码。在arrays中的131072个整数中,Fedora Core 4 Test 3操作系统的执行速度比Windows中完全相同的代码慢3倍。”

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