【问题标题】:C# code runs quick on IIS, but slow on Mono - how to improve it?C# 代码在 IIS 上运行很快,但在 Mono 上运行缓慢 - 如何改进它?
【发布时间】:2011-01-21 05:26:02
【问题描述】:

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

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

【问题讨论】:

  • 做什么:为 Windows 付费 :) 说真的,Mono 往往比 MS .NET 慢 2-5 倍。您使用的是最新的 Mono 吗?对我来说,2.8 版的性能非常好。
  • 如果这是唯一的方法,我将迁移到 Windows 主机。我读过 Mono 的性能与 ASP.NET 大致相当,所以我只是想知道我是否遗漏了一些东西,因为性能要差得多。
  • 我建议运行一些微基准测试来查看问题所在。可能是您的正则表达式在 Mono 上运行得更慢,或者 Mono 连接字符串的速度更慢。您也许可以找到一些次优操作,并用 Mono 上更快的操作替换它们。

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,看起来确实如此。运行一些微基准测试表明,相同的正则表达式在 Mono 上比 IIS 慢十(!)倍。我在他们的 bugzilla (bugzilla.novell.com/show_bug.cgi?id=655133) 上也遇到了一个“严重”错误。一般而言,较慢的性能似乎可以解释其余的延迟,但如果不是正则表达式,它可能是可以接受的。我想我会迁移到 IIS。
【解决方案2】:

安装 Mono,最好在与您的服务器类似的 Linux 系统上。 在 Mono 上分析您的代码并查看瓶颈在哪里。

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

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

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

【讨论】:

    【解决方案3】:

    您使用的是 mod_mono 还是 mod_proxy?虽然您可以从 Mono 中获得一些限制,但与 mod_proxy 相比,使用 mod_mono 获得的一般延迟也会更少。

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

    【讨论】:

      【解决方案4】:

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

      但我认为 leppie 已经做到了,微软花了很多钱测试并将 ASP.net 集成到 IIS 中,所以它真的非常快。如果您不想为 MS 盒子付费,那么您将不得不面对这样一个事实,即 Mono 是开源的,而 IIS 是经过测试的商业产品。

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

      【讨论】:

        【解决方案5】:

        According to this academic study,在某些 Linux 发行版中,由于某些 Linux 系统“与 Windows 相比,进入硬盘缓存/交换空间的倾向要快得多”,因此 Mono 的性能可能会受到阻碍。

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

        随着 Linux 发行版内核调度配置的不同,了解您在 Linux 服务器上运行的操作系统发行版和版本以及您的应用程序可用的内存和 CPU 周期会很有用。

        【讨论】:

          猜你喜欢
          • 2019-08-18
          • 2018-01-14
          • 2014-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 1970-01-01
          相关资源
          最近更新 更多