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

C#代码在IIS上运行快,但在Mono上运行慢-如何改进它?,c#,asp.net,performance,mono,mod-mono,C#,Asp.net,Performance,Mono,Mod Mono,我有一个ASP.NET应用程序,它在我的Windows开发机器上运行良好。不过,服务器是运行Mono的Linux,一旦上传了相同的代码,其运行速度将比在Windows机器上慢4到5倍(例如,一个任务需要25秒,而一个任务需要5秒) 这种性能是Mono的已知问题吗?我能做些什么吗?代码主要是文本处理、字符串替换、正则表达式等,如果这有什么区别的话。我已经在本地使用VS分析和调试了我的代码,但我不知道是否可以使用Mono在服务器上进行远程调试,或者我下一步需要做什么来修复它。您是在使用StringB

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


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

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

但是我认为leppie有点过头了,微软花了很多钱测试并将ASP.net集成到IIS中,所以它真的,真的很快。如果你不想为MS-box付费,那么你必须面对这样一个事实:Mono是开源的,IIS是经过测试的商业产品


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

您是使用mod_mono还是mod_proxy?虽然从Mono中得到的东西有一些限制,但是使用mod_Mono比使用mod_proxy得到的一般延迟要少


请参阅

中的“mod_mono和mod_proxy”一节,正则表达式是mono的一个特别薄弱的领域。Mono的正则表达式类总是使用解释代码,而.Net可以将其转换为编译的IL,从而加快执行速度

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

,在某些Linux发行版中,Mono性能可能会受到阻碍,因为某些Linux系统的“进入硬盘缓存/交换空间的速度比Windows快得多”

“请注意巨大的差异 在两个操作系统中显示 甚至使用本机代码。在131072 Fedora Core中数组中的整数 4执行测试3操作系统 比原速度慢3倍以上 Windows中的代码完全相同。”


由于Linux发行版内核调度配置不同,了解Linux服务器上运行的操作系统发行版和版本以及应用程序可用的内存和CPU周期将非常有用。

安装Mono,最好在与服务器类似的Linux系统上安装。在Mono上评测代码,看看瓶颈在哪里

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

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


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

该做什么:为Windows付费:)不过,说真的,Mono的速度往往比MS.NET慢2-5倍。你用的是最新的单声道吗?在我看来,2.8版的性能相当不错。读了这个吗?如果这是唯一的方法,我会转到Windows主机。我读过的单声道性能和ASP.NET差不多,所以我只是想知道我是否错过了什么,因为性能更差。我建议运行一些微基准,看看问题所在。可能是您的正则表达式在Mono上运行得较慢,或者Mono连接字符串的速度较慢。你可能会发现一些次优的操作,并用Mono上更快的操作来代替。谢谢,看起来确实如此。运行一些微基准测试表明,相同的正则表达式在Mono上比IIS慢十倍。我在他们的bugzilla()上也遇到了一个“关键”bug。总体而言,较慢的性能似乎可以解释其余的延迟,但如果不是正则表达式,这可能是可以接受的。我想我要迁移到IIS。